Ο αλγόριθμος του Λουν (Αγγλικά: Luhn algorithm) ή η συνάρτηση του Λουν, γνωστός και ως "modulus 10" ή "mod 10" αλγόριθμος, είναι μια απλή συνάρτηση ελέγχου αθροίσματος η οποία χρησιμοποιείται ευρέως για έλεγχο ορθότητας αριθμών. Για παράδειγμα χρησιμοποιείται σε έλεγχο ορθότητας αριθμών πιστωτικών καρτών [1], κώδικες IMEI κινητών [2] [3] αλλά και σε αριθμούς κοινωνικής ασφάλειας στις ΗΠΑ και στον Καναδά [4] [5]. Ο αλγόριθμος αναπτύχθηκε από τον ερευνητή της IBM Χανς Πέτερ Λουν και περιγράφεται από την αμερικανική πατέντα με αριθμό 2,950,048 η οποία κατοχυρώθηκε στις 6 Ιανουαρίου 1954 και έληξε στις 23 Αυγούστου 1960. [6]
Η πατέντα του αλγόριθμου έχει λήξει και σήμερα ο αλγόριθμος χρησιμοποιείται ευρέως ενώ στο πρότυπο ISO/IEC 7812-1 έχει τυποποιηθεί.[7] Ο αλγόριθμος αυτός δεν αναπτύχθηκε ως κρυπτογραφική συνάρτηση κατατεμαχισμού αλλά αναπτύχθηκε για προστασία από τυχαία λάθη μεταγραφής των ψηφίων (για παράδειγμα όταν ένας αγοραστής βάζει την πιστωτική κάρτα για αγορές σε μια ιστοσελίδα με τον αλγόριθμο αυτό ελέγχονται τυχόν λάθη κατά την εισαγωγή των ψηφίων της κάρτας). Οι περισσότερες πιστωτικές κάρτες και διάφοροι αριθμοί λογαριασμών, όπως αριθμοί κοινωνικών ασφαλίσεων στον Καναδά και ο Αριθμός Μητρώου Κοινωνικής Ασφάλισης (ΑΜΚΑ) στην Ελλάδα, χρησιμοποιούν αυτόν τον απλό αλγόριθμο για να ξεχωρίσουν τις έγκυρες κάρτες/αριθμούς.
Η συνάρτηση που περιγράφει ο αλγόριθμος αυτός ελέγχει την ορθότητα αριθμών σε σχέση με ένα ψηφίο ελέγχου. Το ψηφίο ελέγχου προστίθεται στο τέλος του αριθμού. [6] Τα βήματα που ακολουθούμε για τον ελέγχο ορθότητας ενός αριθμού είναι τα παρακάτω:
Ας πάρουμε το παράδειγμα ενός λογαριασμού ο οποίος έχει τον αριθμό "7992739871", σε αυτόν τον αριθμό θέλουμε να προσθέσουμε ένα παραπάνω ψηφίο, το ψηφίο ελέγχου x, με το οποίο ο αλγόριθμος του Λουν θα ελέγχει την ορθότητα.: 7992739871x:
Αριθμός λογαριασμού | 7 | 9 | 9 | 2 | 7 | 3 | 9 | 8 | 7 | 1 | x | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
Διπλασιάζουμε κάθε δεύτερο ψηφίο | 7 | 18 | 9 | 4 | 7 | 6 | 9 | 16 | 7 | 2 | - | |
Άθροισμα των ψηφίων | 7 | 9 | 9 | 4 | 7 | 6 | 9 | 7 | 7 | 2 | =67 |
Το ψηφίο ελέγχου x υπολογίζεται με το άθροισμα των ψηφίων και στην συνέχεια πολλαπλασιάζουμε την τιμή αυτή με 9 και στην συνέχεια την διαιρούμε με το 10 και βρίσκουμε το υπόλοιπο (modulo) της διαίρεσης: (67 × 9 mod 10). Ο αλγόριθμος είναι ο παρακάτω:
Άρα ο λογαριασμός με το ψηφίο ελέγχου στο τέλος γίνεται ο 79927398713.
Καθένας από τους παρακάτω αριθμούς 79927398710, 79927398711, 79927398712, 79927398713, 79927398714, 79927398715, 79927398716, 79927398717, 79927398718, 79927398719 μπορεί να επαληθευτεί ότι είναι ορθός με τον παρακάτω τρόπο.
Έστω ότι θέλουμε να ελέγξουμε την πιστωτική κάρτα με αριθμό 4012 8888 8888 1881 με τον αλγόριθμο Λουν. Σύμφωνα με τον αλγόριθμο τα βήματα που ακολουθούμε είναι τα παρακάτω:
Αριθμός πιστωτικής | 4 | 0 | 1 | 2 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 8 | 1 | 8 | 8 | 1 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Διπλασιάζουμε κάθε δεύτερο ψηφίο (από δεξιά) | 8 | 0 | 2 | 2 | 16 | 8 | 16 | 8 | 16 | 8 | 16 | 8 | 2 | 8 | 16 | 1 | |
Άθροισμα των ψηφίων | 8 | 0 | 2 | 2 | 7 | 8 | 7 | 8 | 7 | 8 | 7 | 8 | 2 | 8 | 7 | 1 | =90 |
Το υπόλοιπο της διαίρεσης του 90 με το 10 δίνει 0 (90 modulus 10 = 0), άρα η κάρτα είναι έγκυρη.
Η παρακάτω υλοποίηση του αλγόριθμου είναι σε γλώσσα προγραμματισμού Python.
def luhn_checksum(card_number):
def digits_of(n):
return [int(d) for d in str(n)]
digits = digits_of(card_number)
odd_digits = digits[-1::-2]
even_digits = digits[-2::-2]
checksum = 0
checksum += sum(odd_digits)
for d in even_digits:
checksum += sum(digits_of(d*2))
return checksum % 10
def is_luhn_valid(card_number):
return luhn_checksum(card_number) == 0
Ο παραπάνω αλγόριθμος ελέγχει την εγκυρότητα της εισόδου με ένα ψηφίο ελέγχου. Ο υπολογισμός του ψηφίου ελέγχου χρειάζεται την παρακάτω προσαρμογή:
def calculate_luhn(partial_card_number):
check_digit = luhn_checksum(int(partial_card_number) * 10)
return check_digit if check_digit == 0 else 10 - check_digit
|publisher=
(βοήθεια)