Come l'Algoritmo di Luhn Controlla un Numero di Carta di Credito
Un numero di carta di credito porta con sé una cifra di controllo calcolata secondo l’algoritmo di Luhn: raddoppi alcune cifre partendo da destra, sommi tutto e se il totale è multiplo di 10 il numero è formalmente corretto. È il primo filtro che un modulo di pagamento applica, prima ancora di contattare la banca, e serve solo a scoprire errori di battitura o numeri inventati a caso, non a confermare che la carta esista o abbia fondi.
La regola, in breve
Si parte dalla cifra più a destra e si procede verso sinistra, raddoppiando una cifra sì e una no (la prima, quella più a destra, resta invariata). Se il raddoppio produce un numero a due cifre, si sottrae 9 (equivale a sommare le due cifre tra loro: 8 × 2 = 16, che diventa 1 + 6 = 7, cioè 16 - 9). Alla fine si sommano tutte le cifre, sia quelle toccate dal raddoppio sia quelle lasciate intatte. Se il totale è un multiplo di 10, il numero supera il controllo.
Le reti di pagamento sfruttano proprio questa proprietà: quando emettono una carta, scelgono l’ultima cifra apposta perché il numero completo superi il checksum. Per questo quasi ogni cifra digitata per sbaglio, o ogni numero generato a caso senza seguire la regola, fallisce il controllo.
Esempio pratico: verifichiamo un numero vero passo per passo
Prendiamo il numero di test pubblico di Visa 4111 1111 1111 1111, 16 cifre in tutto. Contando da destra, la posizione 16 (la cifra più a sinistra, il “4”) è pari, quindi va raddoppiata. Le altre posizioni pari raddoppiate sono sette, tutte con cifra “1”. Le otto posizioni dispari restano invariate, anche loro tutte “1”.
| Gruppo di cifre | Calcolo | Contributo alla somma |
|---|---|---|
| Il “4” iniziale (posizione 16, pari, raddoppiata) | 4 × 2 = 8 | 8 |
| Le altre 7 posizioni pari, tutte “1” | 1 × 2 = 2, per 7 volte | 14 |
| Le 8 posizioni dispari, tutte “1” | 1, per 8 volte, invariate | 8 |
| Totale | 30 |
30 diviso 10 dà resto zero: il numero è Luhn-valido. Non è un caso che funzioni proprio così: 4111111111111111 è un numero di test reale che Visa distribuisce apposta per gli sviluppatori, ed è costruito perché il checksum torni esatto.
Perché un solo errore di battitura fa fallire il controllo
Ora cambiamo una sola cifra: l’ultima, quella più a destra, da 1 a 2. Il numero diventa 4111 1111 1111 1112, uno scivolone da tastiera piuttosto comune quando si ricopia una sequenza lunga.
| Versione | Ultima cifra | Contributo (posizione 1, non raddoppiata) | Somma totale | Esito |
|---|---|---|---|---|
Originale ...1111 | 1 | 1 | 30 | Valido |
Con errore ...1112 | 2 | 2 | 31 | Non valido |
La posizione più a destra non viene raddoppiata, quindi la cifra contribuisce al totale con il suo valore reale: prima 1, ora 2. La somma passa da 30 a 31, che non è più multiplo di 10, e il controllo fallisce all’istante. Questo è esattamente il punto di forza di Luhn: intercetta l’errore lato client, prima di qualsiasi chiamata di rete verso il processore di pagamento, risparmiando un round trip inutile e un messaggio d’errore generico all’utente.
Numeri di test noti per circuito
Ogni gateway di pagamento (Stripe, PayPal e simili) pubblica numeri di test pensati apposta per lo sviluppo, tutti Luhn-validi ma privi di qualsiasi legame con una carta reale. Sono sicuri da usare e da pubblicare:
| Circuito | Numero di test | Cifre |
|---|---|---|
| Visa | 4111 1111 1111 1111 | 16 |
| Visa (alternativo) | 4012 8888 8888 1881 | 16 |
| Mastercard | 5555 5555 5555 4444 | 16 |
| American Express | 3782 822463 10005 | 15 |
| Discover | 6011 1111 1111 1117 | 16 |
Nota che American Express raggruppa le cifre in modo diverso (4-6-5 invece di gruppi da 4) e ha 15 cifre anziché 16: entrambe le cose fanno parte dello standard del circuito, non sono un errore di formattazione.
Provalo con il tuo numero
Incolla uno dei numeri della tabella sopra, oppure un tuo numero di test, e vedi il checksum di Luhn e il circuito rilevato in tempo reale:
Cosa NON ti dice Luhn
Superare il checksum dimostra solo che il numero è costruito secondo la regola matematica giusta, niente di più. Non dice se quella carta esiste davvero, se è attiva, se è scaduta o se ha fondi sufficienti per la transazione. Quel tipo di verifica avviene solo quando il numero arriva alla banca emittente, che è l’unica a poter confermare lo stato reale del conto. Un numero inventato a tavolino, purché rispetti la regola del raddoppio, passa il controllo di Luhn tanto quanto una carta vera: per questo i test number della tabella sopra funzionano nei sandbox di sviluppo senza mai muovere denaro reale.
Errori comuni e casi limite
Un errore diffuso è pensare che Luhn catturi qualsiasi tipo di sbaglio. In pratica intercetta la stragrande maggioranza degli errori di una sola cifra e molte trasposizioni tra cifre adiacenti, ma ha un punto cieco documentato: se si scambiano di posizione due cifre adiacenti la cui differenza è esattamente 9 (in pratica uno scambio tra 0 e 9 vicini), il checksum resta identico e l’errore passa inosservato. Non è un difetto di progettazione grave, Luhn nasce nel 1954 come controllo veloce da calcolare a mano, non come sistema crittografico, ma vale la pena saperlo se si costruisce una validazione che si affida a Luhn come unico controllo.
Un altro equivoco frequente riguarda la lunghezza: un numero può essere Luhn-valido e avere comunque la lunghezza sbagliata per il circuito che dichiara di appartenere (16 cifre per Visa ma solo 15 per American Express, per esempio). Un validatore serio controlla sempre entrambe le cose insieme, checksum e lunghezza per prefisso, non solo la prima.
Domande frequenti
Perché una carta di credito ha proprio l’ultima cifra “giusta” per far tornare i conti? Perché è la banca emittente a sceglierla così, non un caso. Quando genera un nuovo numero di carta, calcola tutte le cifre tranne l’ultima, poi sceglie quella finale in modo che l’intero numero superi il checksum di Luhn. Per questo la chiamano “cifra di controllo”: esiste apposta per rendere il numero verificabile.
Il checksum di Luhn viene usato solo per le carte di credito? No, è più diffuso di così: si trova anche nei codici IMEI degli smartphone, in alcuni numeri di tessera sanitaria e in vari identificativi governativi che richiedono un controllo rapido contro errori di trascrizione. La logica è sempre la stessa, cambia solo il numero di cifre coinvolte.
Se un numero supera il controllo di Luhn, posso usarlo per fare un acquisto vero? No, e non funzionerebbe comunque. Superare Luhn dimostra solo che il numero è ben formato dal punto di vista matematico. Una transazione reale passa anche attraverso l’autorizzazione della banca emittente, che verifica scadenza, CVV, fondi disponibili e altri controlli antifrode: nessuno di questi passaggi ha a che fare con l’algoritmo di Luhn.
Perché il mio modulo di pagamento rifiuta un numero che questo strumento segna come valido? Perché il checksum e la lunghezza sono solo il primo filtro, il più superficiale. Se un test number Luhn-valido viene comunque rifiutato, il problema è quasi sempre nel codice del modulo (una regex troppo rigida, uno spazio non rimosso, un campo CVV o data di scadenza mancante), non nel numero stesso. Controllare prima Luhn permette di isolare rapidamente questo tipo di bug prima di guardare altrove.