--| Pengantar
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 di
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)
Contoh :
Normal
0
false
false
false
MicrosoftInternetExplorer4
diketahui Nomor KArtu Sebagai Berikut :
4418 5391 2112 2878
Kita ingin mencari nomor berikutnya
4 4 1 8 5 3 9 1 2 1 1 2 2 8 7 8
* * * * * * * * * * * * * * * *
2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1
= = = = = = = = = = = = = = = =
8 4 2 8 10 3 16 1 4 1 2 2 4 8 14 8
8 + 4 + 2 + 8 + 1 + 0 + 3 + 1 + 6 + 1 + 4 + 1 + 2 + 2 + 4 + 8 + 1 + 4 + 8 =70
70 mod 10 = 0 valid
kita amsumsikan naikan 1 angka
4418 5391 2112 2888 = 72 mod 10 = 2(tidak valid)
4418 5391 2112 288? = 64 mod 10 = 4
10 - 4 = 6 (check digit)
sehingga menjadi
4418 5391 2112 2886
SELAMAT MENCOBA!...
----| 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') << 1;
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))) << 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') << 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
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);
}
|---- EOF ----------------------------------------------------------------|
Salam kenal ya,
BalasHapusKami dari forum deBlogger, komunitas bloggernya orang Depok ingin mengajak semua blogger Depok untuk bergabung dengan komunitas ini.
Kita ingin bangun sebuah komunitas cyber Depok yang up to date thdp Digital Life. Rencananya kita akan grand launching di bulai Mei 2009 dengan mengundang blogger-blogger jempolan. Moga-moga aja bisa ambil bagian di acara ini :D
Join us dengan mengisi form di Daftar Deblogger
Terima kasih,
Rumah Deblogger