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;
}
- Github Gist backup için TCKN_Validator.py
- Github Gist backup için tcnouretici.c