• Algoritma, Kod, e-Devlet 15.09.2008

    Merhaba,

    Kısa bir süre önce Türkiye Cumhuriyeti Kimlik Numarası’nı doğrulama algoritmasını sizlere sunmuştum1. Bunu sunarken de doğrulama yapabilecek bir C++ kod parçacığı yazmıştım. Lakin sonradan düşündüm ve farkettim ki, kimlik numarasına en çok ihtiyaç duyanlar, yani web sitesinde bu alanı sorup doğrulama yapmak isteyenler C++ değil daha çok senaryo tabanlı programlama dilleri kullanıyorlar (scripting based programming language). Bunların en sık kullanılanları da PHP ve JavaScript2. Ben ise uslanmaz bir PERL-sever olarak PHP’yi henüz hakkıyla öğrenmedim. Bu yüzden şimdilik sadece daha hakim olduğum bir dil olan JavaScript ile kimlik numarası doğrulamasının nasıl yapılacağını aşağıdaki kod örneğiyle veriyorum. Direk kopyala-yapıştır yöntemiyle kendi sayfalarınızda kullanabilirsiniz. Yalnız kaynak gösterirseniz beni bahtiyar etmiş olursunuz.

    Kod ile ilgili ufak bir açıklama yapayım. Göreceğiniz üzere modulus diye bir fonksiyon yazdım. Bunun görevi negatif sayıların da modülünü beklediğimiz şekilde almak. PERL ve C++ mod fonksiyonu beklenen şekilde çalışsa da JavaScript’in mod fonksiyonu aynı şekilde çalışmıyor. Bu yüzden bu ek fonksiyona gerek duyuyoruz. Esas fonksiyon olan gecerliMi ise 11 basamaklı bir sayı alıp bu sayının TC kimlik no’su doğrulama algoritmasına uyup uymadığını kontrol ediyor ve uyuyorsa “true”, uymuyorsa “false” döndürüyor. Bunca lafzın ardından işte kod parçacığımız. Güle güle kullanın:

    <script language=’javascript’>
    function modulus(girdi, modul)
    {
    try
    {
    // Negatif tamsayilar icin javascript moduler
    // aritmetik fonksiyonu bekledihimiz gibi calismiyor
    while (girdi < 0)
    {
    girdi += modul ;
    }
    return girdi % modul ;
    }
    catch(hata)
    {
    alert(hata.description) ;
    return -1 ;
    }
    }
    function gecerliMi(kimlikNo)
    {
    // Bu fonksiyon Kirpi tarafindan yazildi.
    // Dilediginiz gibi dagitabilirsiniz.
    // Tek ricam, bu kismi oldugu gibi birakmaniz.
    // 2008, kirpininyeri.com
    try
    {
    //Girilen deger 11 rakamdan mi olusuyor?
    if (!/^\\d{11}$/.test(kimlikNo))
    {
    return false ;
    }

    var X = 0 ;
    var Y = 0 ;
    var ILKON = 0 ;

    var a = parseInt(kimlikNo.substr(9,1)) ;
    var b = parseInt(kimlikNo.substr(10,1)) ;

    for (var i = 0; i < 9; i++)
    {
    var gcc = parseInt(kimlikNo.substr(i,1)) ;
    if (i % 2)
    {
    Y += gcc ;
    }
    else
    {
    X += gcc ;
    }
    ILKON += gcc ;
    }
    var fark = modulus(7*X – Y, 10) ;

    if (fark != a)
    {
    return false ;
    }
    ILKON += a ;

    return (b == modulus(ILKON, 10)) ;
    }
    catch (hata)
    {
    alert(hata.description) ;
    return false ;
    }
    }
    </script>

    Bir de örnek kullanım verelim ki tam olsun:

    <form action=’isle.cgi’ onsubmit=’
    if (!gecerliMi(this.kimlikNo.value))
    {
    alert(“Hatali kimlik no!”) ; return false;
    };’>

    Kimlik numaranızı girin:
    <input name=’kimlikNo’ type=’textbox’ length=’11′
    maxlength=’11′ />

    <input name=’gonder’ value=’Gönder’ type=’submit’ />
    </form>

    Sonradan düşündüm ki, örnek kullanım için kodu verdim ama bir de bunu burada denetleyecek bir form da ben koyayım ki yukarıdaki kodun çalıştığını ispatlamış olayım (proof of concept). Aşağıdaki alana kimlik numaranızı girip Denetle tuşuna basarak kimlik numaranızın bahsettiğim algoritmaya uyup uymadığını, yani geçerli bir kimlik numarası olup olmadığını test edebilirsiniz:

    Kimlik numaranızı girin:

    Kaynaklar:

    1 Bu konudaki önceki yazım
    2 JavaScript nedir merak ediyorsanız burayı inceleyin

    Posted by kirpi, 07:45.

    Etiketler: , , , , ,

  • 3 Responses

    WP_Modern_Notepad

    Yorum Yapın