<p>is straipsnis <strong>nebus</strong> apie programavimą (nors kodo gabalų čia rasite). is straipsnis <strong>nėra</strong> skirtas neteisėtos veiklos skatinimui. Autorius neatsako u alą, kurią gali padaryti io straipsnio skaitytojai.</p>
<p>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):</p>
<p>Kiekvienas lietuvos pilietis turi savo asmens kodą, kuriame naudojamas kontrolinis simbolis. Asmens kodo struktūra:</p>
<p>LYYMMDDXXXK</p>
<p>kur:</p>
<ul>
<li>L - lytis. Lietuviai turi 6 lytis:</li>
<ol>
<li>vyras, gimęs XIX amiuje,</li>
<li>moteris, gimusi XIX amiuje,</li>
<li>vyras, gimęs XX amiuje,</li>
<li>moteris, gimusi XX amiuje,</li>
<li>vyras, gimęs XXI amiuje,</li>
<li>moteris, gimusi XXI amiuje.</li>
</ol>
<li>YYMMDD - gimimo data:</li>
<ul>
<li>YY - metai imtmetyje</li>
<li>MM - mėnuo</li>
<li>DD - diena</li>
</ul>
<li>XXX - eilės numeris, tarp tą dieną gimusiųjų priskiriamas Gyventojų registro.</li>
<li>K - kontrolinis skaičius, apskaičiuojamas dauginant kiekvieną asmens kodo skaitmenį i svorio koeficiento ir sumuojant.</li>
</ul>
<p><code>S = L*1 + Y*2 + Y*3 + M*4 + M*5 + D*6 + D*7 + X*8 + X*9 + X*1</code><br />
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:<br />
<code>S = L*3 + Y*4 + Y*5 + M*6 + M*7 + D*8 + D*9 + X*1 + X*2 + X*3</code><br />
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.</p>
<p>Visų pirma norint surasti mums reikiamą asmens kodą - reikia inoti ar jis toks i viso gali būti naudojamas.</p>
<p>[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]</p>
<p>Paskui - vieta jūsų fantazijai. Galite susigeneruoti visus galimus konkretaus mogauus asmens kodus. Tai daroma itaip:</p>
<p>[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]</p>
<p>Čia a aiku grubiai parenku tuos visus variantus, bet manau originalesni monės sugalvos geresnį variantą.</p>
<p>Taigi, gauname 1000<strong>(!)</strong> 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<strong>(!)</strong>. Palyginus su pradioje gautu tūkstančiu - nebloga atranka. Galų gale, jeigu ir taip nepavyksta, tai iekomas asmens kodas tikrai pus pirmąjame duimtuke.<br />
</p>