Copy Link
Add to Bookmark
Report

Echo Magazine Issue 12 Phile 0x008

eZine's profile picture
Published in 
Echo Magazine
 · 20 Aug 2020

  



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

← previous
next →
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT