Sepa
Rugpjūtis 6, 2006

Asmens kodo saugumas

Š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:
    1. vyras, gimęs XIX amžiuje,
    2. moteris, gimusi XIX amžiuje,
    3. vyras, gimęs XX amžiuje,
    4. moteris, gimusi XX amžiuje,
    5. vyras, gimęs XXI amžiuje,
    6. 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.

Panašūs straipsniai


“Asmens kodo saugumas” komentarų: 28

  1. dado1945

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

  2. asterisk

    na esmė jog pateiktas gan naudingas algoritmas kaip patikrinti ar asmens kodas teisingas, kurį įvedė tarkim tavo svetainės formoje ar ne.. :)

  3. HEADSHOT

    Nelabai kur rasi praktiskai pritaikyti toki dalyka

  4. Sepa

    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…

  5. mid

    tai čia turbūt iš VRM slaptųjų archyvų ištraukei :) :) :)

    made my day

  6. guru_man

    ish VU pirmo kurso konspektu :)

  7. Sepa

    mid, tu be sheip nusishnekejimo ne i tema, galetum konstruktyvesni komentara parashyti?

  8. mid

    ok

  9. enc

    Sepa - nepatinka sarkastiška kritika? .)

  10. petreliukis

    jo…

    cia tai tikrai slapta informacija… uch… kiek daug zalos gali pridaryti…sakes…ir cia tikrai skatina nusikalstama veikla…..

  11. lizdeika

    Tokiu “kodu” vistiek net pasitikėti negalima…

    return ($k[10] == $mod1) ? true : false;

  12. guru_man

    ai nepaminejo kad XXX negali buti lygu nuliui :)

  13. Slave-4-Code

    To: Headshot
    Klysti..

  14. lizdeika

    O kokia vištos koja čia tas BLOGAZ pakreivezotas, kad nukerpa komentarus ?

  15. e

    Gal visus galimus AK greiciau generuotų truputi kitoks scriptas:
    http://p.pixel.lt/paste/2ca0c1e78249a7bafa440b20925f4e03

  16. medutis

    tas “fprintf” tai turbūt ypaČ greitai veikia :)

  17. inkognito

    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

  18. Sepa

    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.

  19. mid

    tu pats bent jau supranti, ką čia parašei?

  20. petreliukis

    Sepa: zodi “motyvacija” cia gal per alfa.lt isgirdai? :D

  21. Sepa

    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.

  22. petreliukis

    Sepa: nu tai galetum bent zinoti zodzio “motyvacija” reiksme ;))

  23. s2

    petreliuki, o gal sugebėtum apibrėžti žodžio „žinoti“ reiškmę? būčiau labai dėkingas…

  24. s2

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

  25. » Pixel.lt ir 2006-ieji metai Archyvas » Pixel.lt

    […] Asmens kodo saugumas (Sepa) - 512 […]

  26. Tokeiito

    Eilini karta broliai lietuviai komentaruose sugeba tiktai dergti arba kritikuoti…

  27. Nostradamus

    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%.

  28. Neon

    jeigu zinau asmens koda pasakik kur man ji reiktu ivest kad pamaticiau viska apie ji !!! suprantat zinau toki Scameri man labai idomu kas jis toks nes nuscemino viena geriausiu srv :\

Rašyti komentarą

Jūs privalote prisijungti jeigu norite rašyti komentarą.