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 vieinimą draudia įstatymas. Tačiau matomai niekas nedraudia pavieinti 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 aiku grubiai parenku tuos visus variantus, bet manau originalesni monės sugalvos geresnį variantą.
Taigi, gauname 1000(!) asmens kodų. Tačiau neisigąskite. Paskutinius penkis imtus kodų galima drąsiai atmesti, nes kain 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ų) - maesnis. Naudojantis tokiomis prielaidomis konkretaus asmens kodo paiekai, galime sumainti tikrinamų AK kiekį net iki 50(!). Palyginus su pradioje gautu tūkstančiu - nebloga atranka. Galų gale, jeigu ir taip nepavyksta, tai iekomas asmens kodas tikrai pus pirmąjame duimtuke.