Issue‎ > ‎Issue 12‎ > ‎

008.txt


..o:( echo zine ):o.. Volume 03, Issue 12 |------------------------------ Luhn Formula ------------------------------| |--------------------------------------------------------------------------| |----------------------- l411v <l411v.ux@gmail.com> -----------------------| ----| 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 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') << 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 ----------------------------------------------------------------|
Comments