Results 1 to 1 of 1
http://idgs.in/202496
  1. #1

    Join Date
    May 2008
    Location
    /proc/sys/kernel/randomize_va_space
    Posts
    875
    Points
    1,326.90
    Thanks: 0 / 13 / 8

    Default [Info&tutorial] Formula Luhn pada Smart card/CC (Credit card)

    Apa itu Formula Luhn?!

    Formula Luhn atau biasa disebut algoritma Luhn disebut adalah algoritma menggunakan modulus 10. Formula ini hanyalah sebuah metoda untuk memastikan kalau nomor pada smartcard adalah benar/valid.

    Smartcard umumnya digunakan sebagai kartu kredit, kartu SIM (Subscriber Identity Module), kartu mahasiswa, kartu asuransi, kartu kesehatan, dll.

    Tidak semua smartcard menggunakan formula Luhn, beberapa diantaranya:
    • ICCID (Integrated Circuit Card IDentifier) dari kartu SIM (19/20 digit).
      Contohnya: 8962XXXXXXXXXXXXXX-X atau 8962XXXXXXXXXXXXXXXX
    • Kartu kredit MasterCard (16 digit)
    • Kartu kredit Visa (16 digit)


    Konsep
    Dalam sistem komunikasi digital ada istilah yang disebut sebagai bit parity, apa itu bit parity?
    Bit Parity adalah sebuah Metode yang digunakan untuk mengecek kebenaran dari suatu informasi dengan jalan penambahan satu atau beberapa bit ke dalam informasi tersebut.

    hal tersebut diterapkan pada metoda formula Luhn yang menambahkan satu digit terakhir('check digit') pada sederetan nomor di smart-card untuk memastikan agar tidak terjadi kesalahan dalam input atau pengiriman nomor smartcard ke tujuan.(formula ini tidak ada kaitannya dengan kriptografi)

    Kalkulasi untuk Menghasilkan Digit Terakhir (Check Digit)

    Berikut adalah tahap-tahap generate-nya:
    • Kalikan dengan dua setiap digit pada urutan 'genap' (digit ke-2, ke-4, ke-6, dst...) jika smartcard memiliki jumlah digit 'genap', atau kalikan dengan dua setiap digit pada urutan 'ganjil' (digit ke-1, ke-3, ke-5, dst...) jika smartcard memiliki jumlah digit 'ganjil', atau kamu bisa mengabaikan antara 'genap' dan 'ganjil' dengan cara mengalikan dengan dua digit yang terakhir, kemudian digit-digit selanjutnya yang berjarak dua hingga digit yang paling awal.
      Jika hasil perkaliannya lebih besar dari 9, maka jumlahkan masing-masing digit tersebut. Contoh: hasilnya adalah 16 (8 dikali dengan 2), lalu jumlahkan 1 dengan 6 (dari angka 16 tadi) menjadi 7. Jadi hasil akhirnya adalah 7.
    • Jumlahkan semua digit (semua hasil dari tahap pertama dan semua digit yang tidak dikalikan dengan dua).
    • Moduluskan hasil dari tahap kedua dengan 10, kemudian kurangkan hasilnya dengan 10. (Modulus adalah nilai sisa dari hasil bagi)
    • Jadikan digit tersebut (hasil dari tahap ketiga) sebagai "check digit" dan letakkan pada urutan terakhir dari rentetan digit-digit smartcard.

    jika bingung mari kita ulas dengan sebuah contoh:

    Nomor kartu kredit yang akan dikeluarkan oleh Bank A: 1234 5678 9012 345 Dengan formula Luhn, kita akan mendapatkan digit terakhir tersebut (check digit)...
    Code:
     1   2   3   4    5   6   7   8    9   0   1   2    3   4   5
     x   x   x   x    x   x   x   x    x   x   x   x    x   x   x
     2   1   2   1    2   1   2   1    2   1   2   1    2   1   2
     =   =   =   =    =   =   =   =    =   =   =   =    =   =   =
     2   2   6   4    10  6   14  8    18  0   2   2    6   4   10
    
     2 + 2 + 6 + 4 +  1+0+6 + 1+4+8 +  1+8+0 + 2 + 2 +  6 + 4 + 1+0 = 58
    dari hasil penjumlahan tadi didapat nilai sebesar 58, sekarang kita moduluskan nilai tersebut dengan 10
    58 % 10 = 8
    kemudian hasilnya kita kurangkan dengan 10
    10 - 8 = 2 (check digit)
    maka Hasil akhir dari nomor kartu kredit yang selanjtnya akan digunakan adalah: 1234 5678 9012 3452

    Kalkulasi untuk Memvalidasi Nomor Smartcard/CC
    Berikut adalah tahapan untuk memvalidasinya:
    • Kalikan dengan dua setiap digit pada urutan 'genap' (digit ke-2, ke-4, ke-6, dst...) jika smartcard memiliki jumlah digit 'ganjil', atau kalikan dengan dua setiap digit pada urutan 'ganjil' (digit ke-1, ke-3, ke-5, dst...) jika smartcard memiliki jumlah digit 'genap', atau kamu bisa mengabaikan antara 'genap' dan 'ganjil' dengan cara mengalikan dengan dua digit ke dua dari terakhir, kemudian digit-digit selanjutnya yang berjarak dua hingga digit yang paling awal.

      Jika hasil perkaliannya lebih besar dari 9, maka jumlahkan masing-masing digit tersebut. Contoh. hasilnya adalah 16 (8 dikali dengan 2), lalu jumlahkan 1 dengan 6 (angka 16 tadi) menjadi 7. Jadi hasil akhirnya adalah 7.
    • Jumlahkan semua digit (semua hasil dari tahap pertama dan semua digit yang tidak dikalikan dengan dua).
    • Hasil dari tahap kedua haruslah kelipatan dari 10. Jika tidak, maka nomor tersebut tidak valid.

    Berikut kita uraikan dengan contoh:

    Nomor kartu kredit dari Bank A: 1234 5678 9012 3452
    Kita akan cek valid atau tidaknya..
    Code:
    1   2   3   4    5   6   7   8    9   0   1   2    3   4   5   2
    x   x   x   x    x   x   x   x    x   x   x   x    x   x   x   x
    2   1   2   1    2   1   2   1    2   1   2   1    2   1   2   1
    =   =   =   =    =   =   =   =    =   =   =   =    =   =   =   =
    2   2   6   4    10  6   14  8    18  0   2   2    6   4   10  2
    
    2 + 2 + 6 + 4 +  1+0+6 + 1+4+8 +  1+8+0 + 2 + 2 +  6 + 4 + 1+0+2 = 60
    dari hasil penjumlahan tersebut kemudian kita moduluskan dengan 10
    60 % 10 = 0 (V A L I D)
    jika hasil modulus 0 menandakan bilangan tersebut habis dibagi 10 dan hasil validasi Kartu kredit tersebut ada VALID

    untuk memudahkan dan karena ini adalah subforum programming berikut algoritma untuk Formula Luhn ini, menggunakan bahasa C:

    Luhn Generator in C
    Code:
    int
    generate_digit (number)
    const char *const number;
    {
            register        i,
                            sum = 0;
            int             added;
            char            double_flag = 1;
    
            for (i = strlen(number) - 1; i >= 0; i--) {
                    if (double_flag) {
                            // One time of left shift mean double the number.
                            added = (number[i] - '0') << 1;
                            if (added > 9) added -= 9;
                    } else
                            added = number[i] - '0';
                    sum += added;
                    double_flag = !double_flag;
            }
    
            return (10 - sum % 10);
    }
    Luhn Generator in JAVA
    Code:
    public int generateCheckDigit (String aCardNumber)
    {
            int        sum = 0,
                    added;
            boolean        doubleFlag = true;
    
            for (int i = aCardNumber.length () - 1; i >= 0; i--) {
                    if (doubleFlag) {
                            // One time of left shift mean double the number.
                            added = (Integer.parseInt 
                                    (aCardNumber.substring (i, i + 1))) << 1;
                            if (added > 9) added -= 9;
                    } else
                            added = Integer.parseInt 
                                    (aCardNumber.substring (i, i + 1));
                    sum += added;
                    doubleFlag = !doubleFlag;
            }
    
            return (10 - sum % 10);
    }
    Luhn validator algorithm in C
    Code:
    {
            register        i,
                            sum = 0;
            int             added;
            char            double_flag = 0;
    
            for (i = strlen(number) - 1; i >= 0; i--) {
                    if (double_flag) {
                            added = (number[i] - '0') << 1;
                            if (added > 9) added -= 9;
                    } else
                            added = number[i] - '0';
                    sum += added;
                    double_flag = !double_flag;
            }
    
            return (sum % 10 == 0);
    }
    Luhn validator algorithm in Java
    Code:
    public boolean isValid (String aCardNumber)
    {
            int        sum = 0,
                    added;
            boolean        doubleFlag = false;
    
            for (int i = aCardNumber.length () - 1; i >= 0; i--) {
                    if (doubleFlag) {
                            added = (Integer.parseInt 
                                    (aCardNumber.substring (i, i + 1))) << 1;
                            if (added > 9) added -= 9;
                    } else
                            added = Integer.parseInt 
                                    (aCardNumber.substring (i, i + 1));
                    sum += added;
                    doubleFlag = !doubleFlag;
            }
    
            return (sum % 10 == 0);
    }
    Source & credits: all crew&staff echo.or.id
    Write author:l411v Edited By:Bl00d13z
    Last edited by bl00d13z; 31-05-09 at 09:37.

  2. Hot Ad

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •