All pastes #118385 Raw Edit

Sepa

public text v1 · immutable
·published 2006-08-06 10:32 UTC
rendered paste body
<p>Šis straipsnis <strong>nebus</strong> apie programavim&#261; (nors kodo gabal&#371; &#269;ia rasite). Šis straipsnis <strong>n&#279;ra</strong> skirtas neteis&#279;tos veiklos skatinimui. Autorius neatsako už žal&#261;, kuri&#261; gali padaryti šio straipsnio skaitytojai.</p>
<p>Taigi prad&#279;siu nuo to, kad kaip žinia - asmens kodas (AK) turi b&#363;ti žinomas tik jo savininkui, ir jo viešinim&#261; draudžia &#303;statymas. Ta&#269;iau matomai niekas nedraudžia paviešinti AK sudarymo algoritm&#261; (paimta iš &#269;ia):</p>
<p>Kiekvienas lietuvos pilietis turi savo asmens kod&#261;, kuriame naudojamas kontrolinis simbolis. Asmens kodo strukt&#363;ra:</p>
<p>LYYMMDDXXXK</p>
<p>kur:</p>
<ul>
	<li>L - lytis. Lietuviai turi 6 lytis:</li>
<ol>
	<li>vyras, gim&#281;s XIX amžiuje,</li>
	<li>moteris, gimusi XIX amžiuje,</li>
	<li>vyras, gim&#281;s XX amžiuje,</li>
	<li>moteris, gimusi XX amžiuje,</li>
	<li>vyras, gim&#281;s XXI amžiuje,</li>
	<li>moteris, gimusi XXI amžiuje.</li>
</ol>
	<li>YYMMDD - gimimo data:</li>
<ul>
	<li>YY - metai šimtmetyje</li>
	<li>MM - m&#279;nuo</li>
	<li>DD - diena</li>
</ul>
	<li>XXX - eil&#279;s numeris, tarp t&#261; dien&#261; gimusi&#371;j&#371; priskiriamas Gyventoj&#371; registro.</li>
	<li>K - kontrolinis skai&#269;ius, apskai&#269;iuojamas dauginant kiekvien&#261; asmens kodo skaitmen&#303; 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&#269;ius. Jei liekana lygi 10, tuomet skai&#269;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&#261; daliname iš 11, ir jei liekana nelygi 10, ji yra asmens kodo kontrolinis skai&#269;ius. Jei v&#279;l liekana yra 10, kontrolinis skai&#269;ius yra imamas lygiu 0.</p>
<p>Vis&#371; pirma norint surasti mums reikiam&#261; asmens kod&#261; - reikia žinoti ar jis toks iš viso gali b&#363;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&#363;s&#371; 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>&#268;ia aš aišku grubiai parenku tuos visus variantus, bet manau originalesni žmon&#279;s sugalvos geresn&#303; variant&#261;.</p>
<p>Taigi, gauname 1000<strong>(!)</strong> asmens kod&#371;. Ta&#269;iau neišsig&#261;skite. Paskutinius penkis šimtus kod&#371; galima dr&#261;siai atmesti, nes kažin ar per dien&#261; m&#363;s&#371; vargo respublikoje gal&#279;t&#371; gimti t&#363;kstantis vaik&#371;. Toliau m&#261;stant, mano tyrin&#279;jimai parod&#279;, kad kuo didesniame mieste gyveni, tuo tavo 'XXX' (t.y. eil&#279;s numeris, tarp t&#261; dien&#261; gimusi&#371;j&#371;) - mažesnis. Naudojantis tokiomis prielaidomis konkretaus asmens kodo paieškai, galime sumažinti tikrinam&#371; AK kiek&#303; net iki 50<strong>(!)</strong>. Palyginus su pradžioje gautu t&#363;kstan&#269;iu - nebloga atranka. Gal&#371; gale, jeigu ir taip nepavyksta, tai ieškomas asmens kodas tikrai pus pirm&#261;jame dušimtuke.<br />
</p>