Pazar, Aralık 22, 2024

TC Kimlik Numarası Nasıl Doğrulanır Ve Üretilir?

nüfus ve vatandaşlık müdürlüğü yüksek çözünürlüklü logo

Eskiden geliştirmiş olduğum ve kullanmayı bıraktığımız TC Kimlik doğrulama modülünün kodları aşağıdaki gibidir, burada hem TC Kimlik numarası algoritması çalıştırılmakta ve doğrulanmaktadır. Aynı zamanda Suriyeli, Mülteci ve İkame izin almış kişilerinde doğrulama işlemleri yapılabilir.

T.C. Kimlik No, on bir (11) haneden oluşan, Nüfus ve Vatandaşlık İşleri Genel Müdürlüğü tarafından Türkiye vatandaşlarına verilmiş 11 rakamdan oluşan kişiye özgü bir sayıdır. Üzerinde basit bir pariteyle hata bulma özelliği bulunmaktadır; ilk 10 rakamın toplamının birler basamağı, 11. rakamı vermektedir. Bu algoritmayı kullanan oluşturuculara yaklaşık 900 milyon kadar geçerli TC kimlik numarası üretilebilmektedir. Ayrıca; 1, 3, 5, 7 ve 9. rakamın toplamının 7 katı ile 2, 4, 6 ve 8. rakamın toplamının 9 katının toplamının birler basamağı 10. rakamı; 1, 3, 5, 7 ve 9. rakamın toplamının 8 katının birler basamağı 11. rakamı vermektedir.

Wikipedia
# Requirements
#   - pip install zeep 
#
# Mertcan GÖKGÖZ - 2019
#   PrismaCSI
#

import re
import zeep
from zeep.cache import SqliteCache
from zeep.transports import Transport

# Koşullara uyan ama kabul etmememiz gerekenlerin listesi
dont_accept_values = (
    '11111111111',
    '11111111110',
    '22222222220',
    '33333333330',
    '44444444440',
    '55555555550',
    '66666666660',
    '77777777770',
    '88888888880',
    '99999999990'
)

# TC Kimlik numara algoritmaya göre doğrumu
def IsDogruTcMi(tckn: str) -> bool:
    if tckn in dont_accept_values:
        return False
    if len(tckn) != 11:
        return False
    if not tckn.isdigit():
        return False
    if int(tckn[0]) == 0:
        return False
    
    tckn_sumary = (sum([int(tckn[i]) for i in range(0, 9, 2)]) * 7 - sum([int(tckn[i]) for i in range(1, 9, 2)])) % 10

    if tckn_sumary != int(tckn[9]) or(sum([int(tckn[i]) for i in range(10)]) % 10) != int(tckn[10]):
        return False
    return True

# Suriyeli/Mülteci/İkame izni kontrolü
def IsSuriyeliMi(tckn: str) -> bool:
    if tckn.startswith('99') or tckn.startswith('997'):
        return True

transport = Transport(cache=SqliteCache(), timeout=10)

# Türk vatandaşlarını nüfus müdürlüğünden kontrol et
def TRIdentificationNumberValidator(tckn: str, ad: str, soyad: str, dogumyil: int) -> bool:
    ApiHost = 'https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?WSDL'
    Service = zeep.Client(wsdl=ApiHost, transport=transport)
    ClientService = Service.service.TCKimlikNoDogrula(tckn, ad.upper(), soyad.upper(), dogumyil)
    return ClientService

# Yabancı uyruklu vatandaşları nüfus müdürlüğünden kontrol et
def ForeignTRIdentificationNumberValidator(tckn: str, ad: str, soyad: str, dogumgun: int, dogumay: int, dogumyil: int) -> bool:
    ApiHost = 'https://tckimlik.nvi.gov.tr/Service/KPSPublicYabanciDogrula.asmx?WSDL'
    Service = zeep.Client(wsdl=ApiHost, transport=transport)
    ClientService = Service.service.YabanciKimlikNoDogrula(tckn, ad.upper(), soyad.upper(), dogumgun, dogumay, dogumyil)
    return ClientService

# Eski Nüfus Cüzdanı Doğrulama
def OldPersonAndIdentificationCardValidator(tckn: str, ad: str, soyad: str, dogumgun: int, dogumay: int, dogumyil: int, serino: str, cuzdan_no: int) -> bool:
    ApiHost = 'https://tckimlik.nvi.gov.tr/Service/KPSPublicV2.asmx?WSDL'
    Service = zeep.Client(wsdl=ApiHost, transport=transport)
    ClientService = Service.service.KisiVeCuzdanDogrula(tckn, ad.upper(), soyad.upper(), dogumgun, dogumay, dogumyil, serino.upper(), cuzdan_no)
    return ClientService

# Yeni Kimlik Kartı Doğrulama
def NewPersonAndIdentificationCardValidator(tckn: str, ad: str, soyad: str, dogumgun: int, dogumay: int, dogumyil: int, tck_seri_no: str) -> bool:
    ApiHost = 'https://tckimlik.nvi.gov.tr/Service/KPSPublicV2.asmx?WSDL'
    Service = zeep.Client(wsdl=ApiHost, transport=transport)
    ClientService = Service.service.KisiVeCuzdanDogrula(tckn, ad.upper(), soyad.upper(), dogumgun, dogumay, dogumyil, tck_seri_no.upper())
    return ClientService

# Türk vatandaşları veya Ikamet izni olanları kontrol et
def tcValidatorClassify(tckn: str, ad: str, soyad: str, dogumgun: int, dogumay: int, dogumyil: int) -> bool:
    if IsSuriyeliMi(tckn):
        return ForeignTRIdentificationNumberValidator(tckn, ad.upper(), soyad.upper(), dogumgun, dogumay, dogumyil)
    else:
        return TRIdentificationNumberValidator(tckn, ad.upper(), soyad.upper(), dogumyil)

Bununla birlikte testler için kullanmak amacıyla geçerli TC kimlik numarası üretmek isterseniz kullanmanız gereken gerekli C kodunu da aşağıya bırakıyorum. Gerekli işlem gücünüz varsa ve ekran kartınızdan destek alırsanız ciddi oranlarda geçerli TC kimlik numarası üretebilirsiniz. Derlemek için gcc -O3 -DMAX_THREAD=8 tcnouretici.c -lpthread komutunu vermeniz yeterli

/*
**
** derleme:
** gcc -O3 -DMAX_THREAD=8 tcnouretici.c -lpthread
**
** i7-4770k 8 thread
** ./a.out > /dev/null  0.02s user 0.01s system 473% cpu 0.008 total
** ./a.out > /dev/null  0.03s user 0.00s system 382% cpu 0.008 total
** ./a.out > /dev/null  0.03s user 0.00s system 484% cpu 0.007 total
** ./a.out > /dev/null  0.03s user 0.00s system 377% cpu 0.008 total
** ./a.out > /dev/null  0.02s user 0.00s system 397% cpu 0.007 total
** ./a.out > /dev/null  0.03s user 0.00s system 454% cpu 0.007 total
** ./a.out > /dev/null  0.03s user 0.00s system 337% cpu 0.008 total
** ./a.out > /dev/null  0.03s user 0.00s system 420% cpu 0.008 total
**
** i7-4770k 1 thread
** ./a.out > /dev/null  0.02s user 0.00s system 79% cpu 0.020 total
** ./a.out > /dev/null  0.02s user 0.00s system 98% cpu 0.020 total
** ./a.out > /dev/null  0.02s user 0.00s system 79% cpu 0.020 total
** ./a.out > /dev/null  0.02s user 0.00s system 79% cpu 0.020 total
** ./a.out > /dev/null  0.02s user 0.00s system 99% cpu 0.020 total
** ./a.out > /dev/null  0.01s user 0.01s system 80% cpu 0.020 total
** ./a.out > /dev/null  0.02s user 0.00s system 80% cpu 0.020 total
** ./a.out > /dev/null  0.02s user 0.00s system 80% cpu 0.020 total
**
*/

#include <unistd.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

#define MAX_TOTAL  100000000
#ifndef MAX_THREAD
#define MAX_THREAD 2
#endif

struct tcno_t {
    unsigned char tcnos[MAX_TOTAL / MAX_THREAD][12];
};

unsigned long xorshf96(unsigned long *x,
                       unsigned long *y,
                       unsigned long *z) {
    unsigned long t;
    *x ^= *x << 16; *x ^= *x >> 5; *x ^= *x << 1;
    t = *x; *x = *y; *y = *z;
    return *z = t ^ *x ^ *y;
}


void *tcnouret(void *p) {
    unsigned int i, j;
    unsigned long t_toplam, c_toplam;
    struct tcno_t *tcnos = (struct tcno_t *) p;
    unsigned long x = rand(), y = rand(), z = rand();

    for (i = 0; i < MAX_TOTAL / MAX_THREAD; ++i) {
        t_toplam = c_toplam = 0;
        for (j = 0; j < 4; ++j) {
            t_toplam += (tcnos->tcnos[i][j*2] = (xorshf96(&x, &y, &z) % 9) + 1);
            c_toplam += (tcnos->tcnos[i][j*2+1] = xorshf96(&x, &y, &z) % 10);
        }
        // bir tane daha tek gerekli (9. sayi)
        t_toplam += (tcnos->tcnos[i][8] = xorshf96(&x, &y, &z) % 10);

        tcnos->tcnos[i][9] = (t_toplam * 7 - c_toplam) % 10;
        tcnos->tcnos[i][10] = (t_toplam + c_toplam + tcnos->tcnos[i][9]) % 10;

        for (j = 0; j < 11; ++j) {
            tcnos->tcnos[i][j] += 48;
        }
        tcnos->tcnos[i][11] = '\n';
    }

    return p;
}


int main (int argc, char *argv[])
{
    unsigned int i;
    pthread_t threads[MAX_THREAD];
    struct tcno_t *tcnos = (struct tcno_t *)
                           malloc(sizeof(struct tcno_t) * MAX_THREAD);

    srand(time(NULL));

    // threadlari olustur
    for (i = 0; i < MAX_THREAD; ++i) {
        pthread_create(&threads[i], NULL, tcnouret, &tcnos[i]);
    }

    // threadlari main threadle birlestir
    for (i = 0; i < MAX_THREAD; ++i) {
        pthread_join(threads[i], NULL);
        write(1, &tcnos[i], sizeof(struct tcno_t));
    }

    free(tcnos);

    return 0;
}