Algoritma Luhn

Formula Luhn atau algoritma Luhn dapat juga disebut dengan algoritma modulus

10.

Formula ini hanyalah merupakan 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 Dasar

Seperti bit parity pada sistem komunikasi digital, formula Luhn menambahkan

satu digit terakhir (disebut 'check digit') dari rentetan nomor pada smart-

card untuk memastikan kalau tidak terjadi kesalahan dalam memasukkan atau

pengiriman nomor smartcard ke tempat tujuan. Sekali lagi, 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, ...) jika smartcard memiliki jumlah digit 'genap', atau

kalikan dengan dua setiap digit pada urutan 'ganjil' (digit ke-1, ke-3,

ke-5, ...) 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 menjadi 7. Jadi hasil akhirnya adalah 7.

- Jumlahkan semua digit (semua hasil dari tahap pertama dan semua digit

yang tidak dikalikan dengan dua).

- Modulus hasil dari tahap kedua dengan 10, kemudian kurangkan hasilnya

dengan 10.

- Jadikan digit tersebut (hasil dari tahap ketiga) sebagai 'check digit'

dan letakkan pada urutan terakhir dari rentetan digit-digit smartcard.

Bingung? Sama... :) Langsung lihat contoh di bawah ini saja;

Nomor kartu kredit yang akan dikeluarkan oleh Bank Krut: 1234 5678 9012 345

Dengan formula berikut (Luhn), kita akan mendapatkan digit terakhir tersebut

(check digit)...

- 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

- 58 % 10 = 8

10 - 8 = 2 (check digit)

- Hasil akhir dari nomor kartu kredit yang selanjtnya akan digunakan

adalah: 1234 5678 9012 3452

=>Kalkulasi untuk Memvalidasi Nomor

Berikut adalah tahap-tahap validate-nya:

- Kalikan dengan dua setiap digit pada urutan 'genap' (digit ke-2, ke-4,

ke-6, ...) jika smartcard memiliki jumlah digit 'ganjil', atau

kalikan dengan dua setiap digit pada urutan 'ganjil' (digit ke-1, ke-3,

ke-5, ...) 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 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 contohnya;

Nomor kartu kredit dari Bank Krut: 1234 5678 9012 3452

Kita akan memvalidasinya...

- 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

- 60 % 10 = 0 (V A L I D)

=>Informasi

Untuk melihat versi Inggris-nya dan beberapa contoh program yang sudah

jadi (menggunakan C, Java, dan Qt/C++), lihat di sini:

www.l411v.com/hardware/smartcard/luhnFormula.html

=>Referensi

[1] Tech FAQ of Smart Card. http://www.hackfaq.org/smart-card.shtml

[2] Secrets of the LUHN-10 Algorithm - An Error Detection Method.

http://www.ee.unb.ca/tervo/ee4253/luhn.html

[3] Wikipedia. http://en.wikipedia.org/wiki/Luhn_algorithm

=>Lampiran

=>Luhn generator algorithm in C

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') <<>

if (added > 9) added -= 9;

} else

added = number[i] - '0';

sum += added;

double_flag = !double_flag;

}

return (10 - sum % 10);

}

--| Luhn generator algorithm in Java

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))) <<>

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

int

valid_number (number)

const char *const number;

{

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') <<>

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

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))) <<>

if (added > 9) added -= 9;

} else

added = Integer.parseInt

(aCardNumber.substring (i, i + 1));

sum += added;

doubleFlag = !doubleFlag;

}

return (sum % 10 == 0);

}

0 komentar:

Posting Komentar

 
Copyright 2009 Riot Act