Türkiye Cumhuriyeti Kimlik Numarası’nı doğrulama

Ne zamandır ilginç bir konu bulsam da yazsam diyorum. Malum uyduruk konulara ayrılmış bir sürü blog bulabilirsiniz. Eh kısmet bugüneymiş. Konumuza gelince, daha önce hiç kimlik numaralarınızın neden bu şekilde olduğunu düşündünüz mü? Hatırlarsanız kimlik numaraları ilk kullanıma girdiğinde sadece Atatürk’e özel bir numara verildiğini, bu numaranın da 10000000146 olduğunu açıklanmışlardı. Neden 10000000000 gibi bir sayı verilmediği sorusunun yanıtı ise son iki basamağın kontrol amaçlı kullanılmasıydı. Kısacası bütün kimlik numaralarının son iki basamağı bir algoritmayla oluşturuluyor. Ama bu algoritmayı tabii ki kimse söylüyor gibi durmuyor.

Bugün takip ettiğim bir forumda kimlik numarasının son basamağının nasıl elde edildiğini yazmışlar. Ben de ama olmaz ki, son iki basamağın nasıl hesaplandığını bulmalıyım dedim ve kolları sıvadım. Gözlerim kan çanağına döndü diyebilirim ama sonunda buldum. Aşağıda son iki basamağın nasıl hesaplandığını veriyorum.

Burada yer alan bilginin nasıl kullanılacağından tamamen siz sorumlusunuz. Bu bilginin kötüye kullanılması halinde herhangi bir şekilde sorumluluk kabul etmediğimi açıkça belirtiyorum. Bunu kabul etmiyorsanız lütfen bu yazının devamını okumayın, ileride sizin de okuyabileceğiniz başka yazılarım da olacak.

Gelelim algoritmaya. Kimlik numaranızın son iki basamağı ilk dokuz basamağının bir fonksiyonudur. Herkesin anlayacağı şekilde anlatmaya çalışayım:

  • Kimlik numarasının soldan 1., 3., 5., 7. ve 9. basamakları toplanır ve bir X sayısı elde edilir.
  • Kimlik numarasının soldan 2., 4., 6. ve 8. basamakları toplanır ve bir Y sayısı elde edilir.
  • Kimlik numaranızın 10. basamağı 7*X-Y sayısının 10 tabanında mod’una eşittir. Yani 7 * X – Y = a mod 10 ise a kimlik numaranızın 10. basamağını oluşturur.
  • Kimlik numaranızın son basamağı ise ilk 10 basamağın toplamının 10 tabanında mod’una eşittir.

Örnek vermek gerekirse kimlik diyelim ki kimlik numaranızın ilk dokuz basamağı 123456780 olsun. Bu durumda kalan iki basamağı hesaplayalım:

X = 1 + 3 + 5 + 7 + 0 = 16.
Y = 2 + 4 + 6 + 8 = 20.

O halde 10. basamak 7*X-Y mod 10 = 7*16 – 20 mod 10 = 92 mod 10 = 2 olacaktır.

Bu durumda kimlik numaranızın ilk on basamağı 1234567892 oldu. 11. basamağı hesaplamak ise daha kolay tabii ki.
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 0 + 2 mod 10 = 38 mod 10 = 8.

Gördüğünüz gibi kimlik numaranız bu durumda 12345678028 olacaktır.

Bu algoritmayı Atatürk’ün kimlik numarasına (10000000146) uygulamak daha kolay olacaktır.
X = 1 + 1 = 2
Y = 0
7 * X – Y mod 10 = 7*2-0 mod 10 = 14 mod 10 = 4.

Son basamak ise 1 + 1 + 4 mod 10 = 6.

Gördüğünüz gibi son derece kolay. Artık kağıt kalemi elinize alıp kendi kimlik numaranız doğru mu diye kontrol edebilirsiniz.

Teknolojik arkadaşlara algoritmayı test edebilecekleri bir C++ kodu da vereyim ki daha da netleşsin.

bool kimlikNoDogrula (char *kimlikNo)
{
int X = 0 ;
int Y = 0 ;
int ILKON = 0 ;

int a = kimlikNo[9] – ’0′ ;
int b = kimlikNo[10] – ’0′ ;

int i ;
for (i = 0; i < 9; i++)
{
int gcc = kimlikNo[i] – ’0′ ;
if (i % 2)
Y += gcc ;
else
X += gcc ;

ILKON += gcc ;
}
int fark = (7*X – Y) % 10 ;

if (fark != a)
return false ;

ILKON += a ;

return (b == ILKON % 10) ;
}

NOT: Bu yazıdan kısa bir süre sonra algoritmayı test edebileceğiniz bir yazı daha yazdım. İlgili yazıya buradan ulaşabilir, kendi kimlik numaranız bu algoritmaya uygun mu, görebilirsiniz.

Kaynaklar:
http://arama.hurriyet.com.tr/arsivnews.aspx?id=123615

Bu yazı Algoritma, e-Devlet kategorisine gönderilmiş ve , , , ile etiketlenmiş. Kalıcı bağlantıyı yer imlerinize ekleyin.
  • tutuyo hakikaten..peki mesela bankaların online başvurular için kullandığı nüfus bilgilerinin kimlik numarasıyla uyuşup uyuşmadığını doğrulamak nasıl oluyor? :) başlığı ilk okuduğumda o geldi de aklıma, e-devlet'imizin buna göre bir api'si falan var mıdır, yoksa herhangi biri uygun kod ile bunu yapabilmekte midir?

  • http://www.kirpininyeri.com kirpi

    şu andaki kimlik doğrulama sayfasını biliyorsundur. belki görmüşsündür aynı işlevi bir zamanlar web servisi aracılığıyla da yapabiliyordun ama kötü niyetli kullanıldığı için veya başka nedenlerle kapadılar. şu anda aynı web servisine belli şirketler yapılan anlaşmalar dahilinde ve ücretli olarak erişebiliyor olmalı. ama zaten erişebilecekleri bilgi de kısıtlı. bunun yerine sitedeki captcha'yı çözmeyi de deneyebilir ve bedava hizmet alabilirsin :)

  • Anonymous

    Formül süper, excel tablosu yapıp sülalemin seceresini çıkarttım. Kaldı ki, nüfus idaresi bile vermiyor bu bilgiyi isteyince.

  • Anonymous

    Bu duruma göre son iki rakam kontrol amaçlı olduğuna göre insanlara tekil bir numara vermek için ilk 9 rakam kullanılabiliyor yani en fazla 100.000.000 kişiye tc kimlik numarası verilebilir. Ya nüfus bunu geçerse ne olacak :)

  • http://www.kirpininyeri.com kirpi

    eski numaraların başına bir sıfır ekleyiverirler diyeceğim ama o zaman yeni formül ne olur bilemem :)

  • Anonymous

    11090802146 nolu bir vatandaş var ama formül uymuyor malesef.

  • http://www.kirpininyeri.com kirpi

    bahsettiğiniz numaranın ilk 9 basamağı şöyle:110908021Algoritmayı uygularsak:X = 1 + 0 + 0 + 0 + 1 = 2Y = 1 + 9 + 8 + 2 = 207*X-Y = 14 – 20 = -6-6 mod 10 = 4O halde ilk 10 basamak 1109080214 olur ve bu basamakların toplamı 2 + 20 + 4 = 26 olur. Bu durumda 11. basamak da 6 olur. Yani bu gönderdiğiniz numara da formüle uyuyor.

  • doğrulama kodu dışında, bir kişinin TCsini biliyorsanız, öncesi ve sonrasındaki istediğiniz sayıda kişinin kimlik numaralarını ve isim soyisimlerinide bulabiliyorsunuz rahatlıkla.

    Nasıl mı oluyor? Söylemem valla sır

  • http://www.kirpininyeri.com kirpi

    –,

    Burada iki sorun var:

    1- Bu lakap sorunlu. Kime hitap edildiği tam anlaşılmıyor. Hiç değilse sahte bir lakap seçseydin de içinde alfanümerik bir şeyler olsaydı :)

    2- Bahsettiğin yöntemi buradaki bilgilerden çıkarmak kolay. Ancak tam yolu tarif etmek kanunsuz dahi olabilir. Söylememende zaten fayda var.

    Ama şöyle ufak bir ipucu vereyim. Bu numaralar kütük numarası denen, hani o koca koca nüfus defterleri var ya onların numaralarına istinaden belli bir süreklilik arzediyor olabilir. Yani bir defterin (kütük no’sunun) içindeki tüm numaralar belli bir bağıntı içinde olabilir. Yani “istediğin kadar numara” deyişi tam olarak doğru değil. Doğrusu "bir kütük dolusu numara" olmalı. Zaten soyağacı çıkardığını iddia eden web siteleri de bunu senin dediğin yönteme istinaden yapıyor. Doğruluğu ise tabii ki tartışılır.

  • Pingback: livewire music downloads