∀ Matematica discreta

Cifre di controllo: Luhn, ISBN e IBAN spiegati con i resti

Come funzionano le cifre di controllo di carte, ISBN e IBAN: algoritmo di Luhn, pesi modulo 10 e 11, verifica modulo 97 e quali errori intercettano.

Quando si digita il numero di una carta di pagamento in un modulo online e un errore viene segnalato prima ancora di inviare i dati, quasi sempre è intervenuta una cifra di controllo. Molti codici di uso quotidiano, come numeri di carta, ISBN dei libri, IBAN e codice fiscale, contengono uno o più caratteri calcolati dagli altri con l'aritmetica modulare. Servono a intercettare gli errori di battitura più comuni.

Quali errori si vogliono intercettare

Chi copia un codice a mano tende a commettere due tipi di errore:

  • errore singolo: una cifra sbagliata, per esempio 7 al posto di 1;
  • trasposizione adiacente: due cifre vicine scambiate, per esempio 34 al posto di 43.

La scelta del modulo e dei pesi decide quali di questi errori vengono intercettati.

La somma semplice non basta

L'idea più ingenua è aggiungere come cifra di controllo la somma delle cifre modulo 10. Intercetta ogni errore singolo, perché cambiare una cifra cambia la somma di una quantità tra 1 e 9, mai multipla di 10. Ma non intercetta nessuna trasposizione: la somma non dipende dall'ordine. Servono quindi pesi diversi per posizioni diverse.

L'algoritmo di Luhn

È usato per i numeri delle carte di pagamento e per vari altri identificativi. Partendo dalla cifra più a destra (la cifra di controllo stessa):

  1. si raddoppia una cifra sì e una no, cominciando dalla seconda da destra;
  2. se un raddoppio supera 9, si sottrae 9 (equivale a sommare le due cifre del risultato);
  3. si sommano tutte le cifre così ottenute;
  4. il numero è valido se la somma è un multiplo di 10.

Esempio con il numero di prova 79927398713, letto da destra:

Cifra 3 1 7 8 9 3 7 2 9 9 7
Dopo 3 2 7 7 9 6 7 4 9 9 7

La somma è 70, multiplo di 10: il numero è valido. Scambiando le ultime due cifre (…731) la somma diventa 72 e l'errore viene segnalato.

Luhn intercetta tutti gli errori singoli e quasi tutte le trasposizioni adiacenti. L'eccezione è lo scambio tra 09 e 90: raddoppiando, 0 resta 0 e 9 diventa 18 − 9 = 9, quindi le due sequenze danno lo stesso contributo.

ISBN-13: pesi 1 e 3 modulo 10

Il codice ISBN a 13 cifre, lo stesso del codice a barre EAN dei prodotti, usa pesi alternati 1 e 3. Il codice è valido se

c₁ + 3c₂ + c₃ + 3c₄ + … + c₁₃ ≡ 0 (mod 10)

Esempio: 978-0-306-40615-7. La somma pesata è 100, multiplo di 10.

Errori singoli: tutti intercettati, perché moltiplicare per 1 o per 3 una variazione da 1 a 9 non dà mai un multiplo di 10 (3 è invertibile modulo 10). Trasposizioni: lo scambio di due cifre adiacenti a e b cambia la somma di 2(a − b), che è un multiplo di 10 quando a e b differiscono di 5. Lo scambio tra 1 e 6, per esempio, passa inosservato.

ISBN-10: il vantaggio di un modulo primo

Il vecchio ISBN a 10 cifre usava pesi da 10 a 1 e il modulo 11:

10c₁ + 9c₂ + 8c₃ + … + 1 · c₁₀ ≡ 0 (mod 11)

Poiché il resto può valere 10, la cifra di controllo poteva essere la lettera X. Esempio: 0-306-40615-2, con somma pesata 132 = 12 · 11.

Il modulo 11 è primo, e questo dà un risultato più forte: tutti gli errori singoli e tutte le trasposizioni adiacenti vengono intercettati. Una trasposizione cambia la somma di (a − b) moltiplicato per una differenza di pesi pari a 1, e un numero tra 1 e 9 non è mai multiplo di 11.

IBAN: modulo 97

L'IBAN contiene due cifre di controllo subito dopo il codice del paese. La verifica segue lo standard ISO 13616:

  1. si spostano i primi quattro caratteri in fondo;
  2. si sostituisce ogni lettera con un numero, A = 10, B = 11, …, Z = 35;
  3. si interpreta il risultato come un unico numero intero;
  4. l'IBAN è valido se il resto della divisione per 97 è 1.

Con l'esempio standard GB82 WEST 1234 5698 7654 32 il resto è proprio 1. Per calcolarle si mette 00 al loro posto e si prende 98 meno il resto modulo 97.

def iban_valido(iban):
    s = iban.replace(" ", "").upper()
    s = s[4:] + s[:4]
    numero = "".join(str(int(c, 36)) for c in s)
    return int(numero) % 97 == 1

Due cifre di controllo e un modulo primo vicino a 100 permettono di intercettare tutti gli errori singoli, tutte le trasposizioni adiacenti e la grande maggioranza degli errori più complessi.

Cosa non fanno

Una cifra di controllo non è una firma né una protezione crittografica: chiunque può calcolarla, e un numero valido per Luhn non è per questo una carta reale o attiva. Nei sistemi che sviluppo è una prima convalida per dare all'utente un messaggio immediato, mai un sostituto delle verifiche presso chi ha emesso il codice.

In sintesi

  • Le cifre di controllo usano l'aritmetica modulare per intercettare errori di battitura.
  • La semplice somma delle cifre non rileva le trasposizioni: servono pesi diversi.
  • Luhn rileva tutti gli errori singoli e quasi tutte le trasposizioni, tranne 09 ↔ 90.
  • ISBN-13 sfugge agli scambi tra cifre che differiscono di 5; ISBN-10 e IBAN, con moduli primi, no.
  • Un codice con la cifra di controllo corretta è coerente, non necessariamente autentico.
MM
Marco Marzaduri

Marco Marzaduri si occupa di cybersecurity, informatica forense e sviluppo web. Laureato in informatica, unisce il rigore dell'analisi tecnica all'attenzione per le persone che usano la tecnologia.

Leggi anche