IMEI – Kredi Kart Numarası Hesaplama – Doğrulama

Merhabalar, Şuan Iphone6 canlı yayında tanıtılıyor ama internet yayını çok kotu izlenmiyor… Uzun zamandır yazmıyorum. İş güç değişimler zamansızlık dan öte kendime zaman ayırma lüksümün olmadığını düşündüğümden yazmıyordum belkide. Gevezeyim yazdığımda uzuyıp gidiyor. Fazla uzatmadan konuya geleyim.

Bir arkadaş az önce aradı MOD10 Kart no hesaplama diye bir şey varmış sen bilirsin. Eeee bilirim de ? dememe kalmadan bilirim dediğim an bana o lazım diye geldi istek. mod10 olarak arkadaşın söylediği şey aslında Luhn Algorithm (Luhn Algoritması)

Kısa tarih bilgisi ile bir alman olan Hans Peter Luhn abimiz tarafından 1954 yılında dakte edilen sayıların yanlış girilip girilmediğini kontrol amaclı geliştirilmiş. IMEI – Kredikarti gibi sayıların son karakterinde doğrulama kodu olarak kullanılır.

Kendi kullandığım fonksiyonları paylaşmak istemedim. Bir googlelayım dedim. 2-3 sayfada karsıma kodtarifi diye bir siteden makale çıktı.

using System;
using System.Linq;
//Credit Card Check Digit - Luhn Algorithm
namespace LuhnAlgorithm
{
    class Program
    {
        static void Main(string[] args)
        {
           string ccNo = "4022999999994026";
           bool sonuc = IsLuhnValid(ccNo);//Parametre olarak k.k numarası geçilir.
        }

        public static bool IsLuhnValid(string value)
        {
            return value.Where(c => Char.IsDigit(c)).Reverse()
              .SelectMany((c, i) => ((c - '0') << (i & 1)).ToString())
              .Sum(c => c - '0') % 10 == 0;
        }
    }
}

kullanım seklide :

string ccNo = "4022999999994026";
bool sonuc = IsLuhnValid(ccNo);//Parametre olarak k.k numarası geçilir.
if(!sonuc)
 Console.WriteLine("Kart numarası hatalı!");
else
 Console.WriteLine("Kart numarası doğru.");

Sayfanın üst kısmından gördüm ki sitenin sahibi Fulya hanım mış, paylaştığı kod için teşekkür ederim. Kendisi iş hayatından tanıdığım ve aynı projede görev aldığım bir insan.

Bu arada kendi kodumu paylaşmama nedenim çok gizli özel kapalı saklama kabında hatta banka kasasında saklanması gereken bir kod olduğundan değil. Bayağı eskiden kalma iş görecek kadar yazılmış bir kod olmasından dolayı. Ebem dedem misali düz ve gerektiği kadar kod yazan bir insanim. Türemeler Miraslar kalıtımlar günümüzde gereksiz fazla kullaniliyor bence. Hala entity framework yerine kendi dbHelper sinifi uzerinden db işlemlerini yürüten birisi olarak yeterince dinazor olduğumu belirterek kendi kodumuda buraya ekliyim :

        public string LuhnCheck(string cardNumber)
        {
            int total = 0;
            int power = 2;

            for (int i = cardNumber.Length - 2; i >= 0; i += -1)
            {
                int res = Convert.ToInt32(cardNumber.Substring(i, 1)) * power;
                if (res >= 10)
                    res -= 9;
                total += res;
                power = power ^ 3;
            }

            total = 10 - (total % 10);
            if (total != 10)
            {
                return total.ToString();
            }
            else
            {
                return "0";
            }
        }

burdaki kodun calisma mantigi son karakteri hesaplama

string strCardNo = BIN + strSelectedCardNoPad.PadLeft(7, '0').Substring(0, 7);
string chrChckDjt =  LuhnCheck(strCardNo + "0");
return strCardNo + chrChckDjt;

Şeklinde de bir yerde kullanmışım mesela. BIN kodu kart’a ait Patentli seri no başlangıç bölümü. Sonrasında gerekli hesaplamaları yapıp üretilen 15 haneli kart numarasına son karakter eklenerek toplam 16 haneli kart numarası elde ediliyor.

Bu kodu verip bitirmek olmamalı; Mantığınıda anlatmaya çalışıyım.

Örnek kart No : 4022999999994026
bunda numaraları 1’er atlayarak grupluyoruz, Yukarda Kalın ve Kırmızılar diye iki grup oluştu.

Kalınları (ilk karakteri ve 1’er atlanmış halini) 2 ile carpıyor çift hane çikarsa bir sonucun onlar ve birler basamağını topluyoruz. Kırmızıları ise direk topluyoruz.

4 x 2 2 x 2 9 x 2 9 x 2 9 x 2 9 x 2 4 x 2 2 x 2
8 4 18 -> 1+8 18 -> 1+8 18 -> 1+8 18 -> 1+8 8 4
8 4 9 9 9 9 8 4

8 + 4 + 9 + 9 + 9 + 9 + 8 + 4 = 60 ilk cift sonucu

0 + 2 + 9 + 9 + 9 + 9 + 0 + 644

60 + 44 = 104

104 Mod 10 = 4

Luhn algoritmasina Mod10 yada Modulus 10 algoritmasi denmesinin sebebi bu işlemler bittiginda olusan sonucun Mod10 yapıldığında 0 kalması gerekmekte olmasıdır. Yani hesapladigimiz Kart no Luhn algoritmasina uymuyor Mod10 da sonuc 4 kaliyor. son karakter 6 degil 2 olsa toplamda 4 değer duşeceğinden Luhn algoritmasına uygun kod elde etmiş olacaktık.

Online kontrol ve test yapmak isteyen olursa : http://planetcalc.com/2464/ adresinde hazir bir tane mevcut. Luhn degeri 0 tutturmaya calişcaksınız.
Her türlü Akıllı kart ürünü Yoroca tarafından geliştirile bilir, Aklınızda bulunsun, belki gerekir…

4 comments

Rakkoc için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.