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):
- si raddoppia una cifra sì e una no, cominciando dalla seconda da destra;
- se un raddoppio supera 9, si sottrae 9 (equivale a sommare le due cifre del risultato);
- si sommano tutte le cifre così ottenute;
- 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:
- si spostano i primi quattro caratteri in fondo;
- si sostituisce ogni lettera con un numero, A = 10, B = 11, …, Z = 35;
- si interpreta il risultato come un unico numero intero;
- 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.