T.C kimlik numarasının doğrulama özellikleri şu şekildedir;
- T.C kimlik numarası 11 haneli ve sayısal olmalıdır.
- T.C kimlik numarası 0 ile başlayamaz.
- T.C kimlik numarasının 11 haneli ve sayısal değerde olduğu kontrol edilir. İlk 9 rakam arasındaki formül 10.cu rakamı, ilk 10 rakam arasındaki formülasyon ise 11.ci rakamı oluşturur. İlk rakam 0 olamaz.
- 1,3,5,7 ve 9.cu hanelerin toplamının 7 ile çarpımından 2,4,6, ve 8. haneler çıkartıldığında geriye kalan sayının 10’a göre modu 10. haneyi verir. (çıkarma işleminden elde edilen sonucun 10’a bölümünden kalan) 1,2,3,4,5,6,7,8,9 ve 10. sayıların toplamının 10’a göre modu (10’a bölümünden kalan) 11. rakamı sağlar.
Bu kontroller sadece T.C kimlik numarasının doğruluğunu gösteriyor. Yani isim soyisminin doğru girilip girilmediğine bakmak için ise Nüfus Müdürlüğünün bir servisi bulunuyor. Bunu kullanarak ilgili siteye Tc, Ad, Soyad ve Doğum yılını gönderiyoruz. Bize true veya false şeklinde yanıt döndürüyor. Bu işlemleri yapabilen programın kodları aşağıdadır.
Program.cs
using System; namespace T.C_Dogruluk_Kontrol { class Program { static void Main(string[] args) { Console.Write("TC: "); long tc = long.Parse(Console.ReadLine()); // doğum tarihini okuduk Console.Write("AD: "); string name = Console.ReadLine().ToUpper(); // ismi okuduk ve tamamını büyük harfe dönüştürdük Console.Write("SOYAD: "); string surname = Console.ReadLine().ToUpper(); // soyadı okuduk ve tamamını büyük harfe dönüştürdük Console.Write("DOĞUM TARİHİ(YIL): "); int birthdate = int.Parse(Console.ReadLine()); // doğum tarihini okuduk Identity control = new Identity(tc, name, surname, birthdate); switch (control.check()) { case 1: Console.WriteLine("Girilen T.C teyit edilmiştir."); break; case 2: Console.WriteLine("T.C geçersizdir."); break; case 3: Console.WriteLine("Girilen T.C ve kişi bilgileri uyuşmamaktadır."); break; } Console.ReadKey(); } } }
Identity.cs
using System.IO; using System.Net; using System.Xml; using System; /* Muhammet Tayyip Muslu muslu.net tayyipmuslu@gmail.com */ namespace T.C_Dogruluk_Kontrol { class Identity { private long tc; private string name; private string surname; private int year; public Identity(long tc, string firstname, string lastname, int birthYear) { Tc = tc; Firstname = firstname; Lastname = lastname; BirthYear = birthYear; } public long Tc { set { if (value > 0 && value < 99999999999 && value.ToString().Length == 11) tc = value; else Console.WriteLine("Hata: T.C Kimlik numarası 11 haneli ve sayısal değerde olmalıdır."); } get { return tc; } } public string Firstname { set { name = value.ToString().ToUpper(); } get { return name; } } public string Lastname { set { surname = value.ToString().ToUpper(); } get { return surname; } } public int BirthYear { set { year = value; } get { return year; } } public int check() { if (firstControl(Tc) == 1) { if (secondControl()) return 1; else return 3; } else { return 2; } } private byte firstControl(long tc) { if (tc > 0 && tc < 99999999999 && tc.ToString().Length == 11) { char[] arr = tc.ToString().ToCharArray(); int sumEven = 0, sumOdd = 0, sumFirst10 = 0, i = 0; if (arr[0] == '0') return 2; // ilk rakam 0 olamaz while (i <= 8) { int temp = int.Parse(arr[i].ToString()); sumFirst10 += temp; if (i % 2 == 1) sumEven += temp; else sumOdd += temp; i++; } sumFirst10 += int.Parse(arr[9].ToString()); // 10 ve 11. hane kontrolü yapılıyor. if (((sumEven * 9) + (sumOdd * 7)) % 10 == int.Parse(arr[9].ToString()) && (sumFirst10 % 10 == int.Parse(arr[10].ToString()))) return 1; else return 2; } else return 0; } private bool secondControl() { var uri = new Uri("https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx"); // T.C kimlik sorgulama servisine bu sayfadan sorgu yapacağız var request = (HttpWebRequest)WebRequest.CreateDefault(uri); // bir istek oluşturduk // istek bilgileri bkz : https://tckimlik.nvi.gov.tr/Service/KPSPublic.asmx?op=TCKimlikNoDogrula request.ContentType = "text/xml; charset=utf-8"; request.Method = "POST"; request.Accept = "text/xml"; request.Headers.Add("SOAPAction", "http://tckimlik.nvi.gov.tr/WS/TCKimlikNoDogrula"); // SOAP xml dosyası ve bilgileri göndereceğimiz XML var xml = @"<?xml version=""1.0"" encoding=""utf-8""?> <soap:Envelope xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" xmlns:soap=""http://schemas.xmlsoap.org/soap/envelope/"" > <soap:Body> <TCKimlikNoDogrula xmlns=""http://tckimlik.nvi.gov.tr/WS""> <TCKimlikNo>" + Tc + @"</TCKimlikNo> <Ad>" + Firstname + @"</Ad> <Soyad>" + Lastname + @"</Soyad> <DogumYili>" + BirthYear + @"</DogumYili> </TCKimlikNoDogrula> </soap:Body> </soap:Envelope>"; // xml i okuyoruz XmlDocument soapEnvelopeXml = new XmlDocument(); soapEnvelopeXml.LoadXml(xml); // sunucuya istek gönderiyoruz using (Stream stream = request.GetRequestStream()) { soapEnvelopeXml.Save(stream); } // gelen cevabı burada okuyoruz. using (WebResponse response = request.GetResponse()) { using (StreamReader rd = new StreamReader(response.GetResponseStream())) { string soapResult = rd.ReadToEnd(); // cevap yine xml olarak dönüyor. Biz xml taglarından kurtulduğumuzda bize true veya false değeri kalır // tc geçerli ise true, değil ise false değeri döner return bool.Parse(System.Text.RegularExpressions.Regex.Replace(soapResult, "<.*?>", String.Empty)); } } } } }