Š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:

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.

[code lang="php"] 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; } [/code]

Paskui - vieta jūsų fantazijai. Galite susigeneruoti visus galimus konkretaus žmogauus asmens kodus. Tai daroma šitaip:

[code lang="php"] $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"); [/code]

Č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 pus pirmąjame dušimtuke.