Šis straipsnis nebus apie programavimą (nors kodo gabalų čia rasite). Šis straipsnis nėra skirtas neteisėtos veiklos skatinimui. Autorius neatsako už žalą, kurią gali padaryti šio straipsnio skaitytojai.
Taigi pradėsiu nuo to, kad kaip žinia - asmens kodas (AK) turi būti žinomas tik jo savininkui, ir jo viešinimą draudžia įstatymas. Tačiau matomai niekas nedraudžia paviešinti AK sudarymo algoritmą (paimta iš čia):
Kiekvienas lietuvos pilietis turi savo asmens kodą, kuriame naudojamas kontrolinis simbolis. Asmens kodo struktūra:
LYYMMDDXXXK
kur:
- L - lytis. Lietuviai turi 6 lytis:
- vyras, gimęs XIX amžiuje,
- moteris, gimusi XIX amžiuje,
- vyras, gimęs XX amžiuje,
- moteris, gimusi XX amžiuje,
- vyras, gimęs XXI amžiuje,
- moteris, gimusi XXI amžiuje.
- YYMMDD - gimimo data:
- YY - metai šimtmetyje
- MM - mėnuo
- DD - diena
- XXX - eilės numeris, tarp tą dieną gimusiųjų priskiriamas Gyventojų registro.
- K - kontrolinis skaičius, apskaičiuojamas dauginant kiekvieną asmens kodo skaitmenį iš svorio koeficiento ir sumuojant.
S = L*1 + Y*2 + Y*3 + M*4 + M*5 + D*6 + D*7 + X*8 + X*9 + X*1
Suma S dalinama iš 11, ir jei liekana nelygi 10, ji yra asmens kodo kontrolinis skaičius. Jei liekana lygi 10, tuomet skaičiuojama nauja suma su tokiais svorio koeficientais:
S = L*3 + Y*4 + Y*5 + M*6 + M*7 + D*8 + D*9 + X*1 + X*2 + X*3
Dar kartą daliname iš 11, ir jei liekana nelygi 10, ji yra asmens kodo kontrolinis skaičius. Jei vėl liekana yra 10, kontrolinis skaičius yra imamas lygiu 0.
Visų pirma norint surasti mums reikiamą asmens kodą - reikia žinoti ar jis toks iš viso gali būti naudojamas.
function ar_asmens_kodas($k) { if(!is_numeric($k) || strlen($k) != 11) return false; $chkSum1 = 0; $chkSum2 = 0; for($i = 0; $i < 10; $i++) { // pirma suma S $chkSum1 += (($i + 1) != 10) ? ($k[$i] * ($i + 1)) : ($k[$i] * 1); // antra suma S (jeigu pirmosios liekana bus lygi 10 - naudosim shita suma) $chkSum2 += ($i < 7) ? ($k[$i] * ($i + 3)) : ($k[$i] * ($i - 6)); } // gauname dalmenis $mod1 = $chkSum1 % 11; $mod2 = $chkSum2 % 11; // tikrinam pagal auksciau aprasyta algoritma if($mod1 != 10) { return ($k[10] == $mod1) ? true : false; } if($mod2 == 10) { $mod2 = 0; } return ($k[10] == $mod2) ? true : false; }
Paskui - vieta jūsų fantazijai. Galite susigeneruoti visus galimus konkretaus žmogaus asmens kodus. Tai daroma šitaip:
$kodas = "3550505"; // lytis ir gimimo data for($x1 = 0; $x1 < 10; $x1++) for($x2 = 0; $x2 < 10; $x2++) for($x3 = 0; $x3 < 10; $x3++) for($k = 0; $k < 10; $k++) { if(ar_asmens_kodas($kodas . $x1 . $x2 . $x3 . $k) == 1) $geri_kodai[] = $kodas . $x1 . $x2 . $x3 . $k; } $f = fopen("asmenskodai.txt", "w+"); if(!$f) die("Error!"); if(!empty($geri_kodai) || !isset($geri_kodai)) foreach($geri_kodai as $value) fprintf($f, $value . "\n");
Čia aš aišku grubiai parenku tuos visus variantus, bet manau originalesni žmonės sugalvos geresnį variantą.
Taigi, gauname 1000(!) asmens kodų. Tačiau neišsigąskite. Paskutinius penkis šimtus kodų galima drąsiai atmesti, nes kažin ar per dieną mūsų vargo respublikoje galėtų gimti tūkstantis vaikų. Toliau mąstant, mano tyrinėjimai parodė, kad kuo didesniame mieste gyveni, tuo tavo ‘XXX’ (t.y. eilės numeris, tarp tą dieną gimusiųjų) - mažesnis. Naudojantis tokiomis prielaidomis konkretaus asmens kodo paieškai, galime sumažinti tikrinamų AK kiekį net iki 50(!). Palyginus su pradžioje gautu tūkstančiu - nebloga atranka. Galų gale, jeigu ir taip nepavyksta, tai ieškomas asmens kodas tikrai bus pirmąjame dešimtuke.
2006-08-06 | 19:03
Aš gan žiauriai ir griežtai įvertinsiu :) Galima buvo ir trumpiau parašyti: Žinant žmogaus gimimo dieną ir lytį lieka tik 1000 jo asmens kodo variantų… Paaiškinimai irgi gerai - turbūt jau koks 2000tasis internete. O šiaip asmens kodo padirbinėjimas reikalingas tik nepilnamečiams norintiems patekti į naktinį klubą… O normalus žmogus savo asmens kodo niekur neturėtų duoti - tik išskirtinais atvejais. Bet šiaip nereikia būti paranojiškiems :-)
2006-08-06 | 19:44
na esmė jog pateiktas gan naudingas algoritmas kaip patikrinti ar asmens kodas teisingas, kurį įvedė tarkim tavo svetainės formoje ar ne.. :)
2006-08-06 | 19:49
Nelabai kur rasi praktiskai pritaikyti toki dalyka
2006-08-06 | 20:31
dado1945 ? “Žinant žmogaus gimimo dieną ir lytį lieka tik 1000″ - gal pirma pasižiūrėk ir paskaityk mano straipsnį. Po datos ir lyties eina keturi skaitmenys nuo 0 iki 9, t.y. 10 * 10 * 10 * 10 -> 10′000 variantų. Nenada čia man lele, aš tikiu, kad kada prisigadys ir jums šitas kodo šmotas, jūs net nenumanot kokiais būdais…
2006-08-07 | 8:57
tai čia turbūt iš VRM slaptųjų archyvų ištraukei :) :) :)
made my day
2006-08-07 | 9:48
ish VU pirmo kurso konspektu :)
2006-08-07 | 10:09
mid, tu be sheip nusishnekejimo ne i tema, galetum konstruktyvesni komentara parashyti?
2006-08-07 | 10:29
ok
2006-08-07 | 10:29
Sepa - nepatinka sarkastiška kritika? .)
2006-08-07 | 10:36
jo…
cia tai tikrai slapta informacija… uch… kiek daug zalos gali pridaryti…sakes…ir cia tikrai skatina nusikalstama veikla…..
2006-08-07 | 10:38
Tokiu “kodu” vistiek net pasitikėti negalima…
return ($k[10] == $mod1) ? true : false;
2006-08-07 | 10:48
ai nepaminejo kad XXX negali buti lygu nuliui :)
2006-08-07 | 14:54
To: Headshot
Klysti..
2006-08-07 | 17:10
O kokia vištos koja čia tas BLOGAZ pakreivezotas, kad nukerpa komentarus ?
2006-08-08 | 1:03
Gal visus galimus AK greiciau generuotų truputi kitoks scriptas:
http://p.pixel.lt/paste/2ca0c1e78249a7bafa440b20925f4e03
2006-08-08 | 14:42
tas “fprintf” tai turbūt ypaČ greitai veikia :)
2006-08-10 | 21:51
seip su tom prielaidom, kad galima XXX sumazint iki 50… kokiu pagrindu? cia tu nusprendei kad per diena negali tiek gimt?:D
va mano yra daugiau uz 50
2006-08-11 | 10:27
Cituoju save: “galime sumažinti tikrinamų AK kiekį net iki 50(!)”, tai reiškia, kad sumažinti AK kiekį, o ne XXX dalį. Jeigu būsi protingas, ir motyvuotai atmesi, sakykim, pirmus 20 asmens kodų, ir imsi likusius 50, tai XXX bus nuo 21 iki 70 imtinai. O jau tarp jų gal ir bus tavo AK.
2006-08-11 | 10:29
tu pats bent jau supranti, ką čia parašei?
2006-08-11 | 10:31
Sepa: zodi “motyvacija” cia gal per alfa.lt isgirdai? :D
2006-08-11 | 13:45
mid: suprantu, ir labai sėkmingai tai panaudojau ten, kur priėjimui prie konfidencialios informacijos reikia vardo, pavardės ir asmens kodo.
petreliukis: aš ne tamstos mados būsiu ir mandrų žodžių žiūrėdamas TV nesirankioju.
2006-08-11 | 17:46
Sepa: nu tai galetum bent zinoti zodzio “motyvacija” reiksme ;))
2006-08-29 | 20:13
petreliuki, o gal sugebėtum apibrėžti žodžio „žinoti“ reiškmę? būčiau labai dėkingas…
2006-08-29 | 21:17
terp kitko: kolega vilnietis, gimęs Vilniuje, nešioja XXX=118. gal apsimokėtų paskaičiuot statistinę/tikimybinę priklausomybę tarp miesto dydžio (atitinkančio gimimo metus) ir XXX ? pradžiai gal užtektų koreliacijos koeficiento… ar bent pasiskirstymo dėsnio apytiksliu grafiniu pavidalu :))
2007-01-01 | 12:16
[…] Asmens kodo saugumas (Sepa) - 512 […]
2007-01-24 | 15:37
Eilini karta broliai lietuviai komentaruose sugeba tiktai dergti arba kritikuoti…
2007-12-28 | 22:16
Apie asmens kodo slaptumą:
http://lietuvos-ak.blogspot.com/
Čia taip pat pateikti visi galimi Lietuvos vyrų ir moterų asmens kodai, remtasi statistikos departamento gimstamumo informacija, perteklius ~20%.