Menu

Algorithme de Luhn : pourquoi les numéros de carte finissent par un chiffre de contrôle

L'algorithme de Luhn est une somme de contrôle modulo 10 derrière le dernier chiffre d'un numéro de carte. Apprenez à le calculer à la main, ce qu'il détecte et ce qu'il ne peut pas prouver.

Publié le

  • données de test
  • paiements
  • Luhn

L’algorithme de Luhn est la raison pour laquelle un numéro de carte se termine par un chiffre qui paraît arbitraire. C’est une somme de contrôle — un petit résumé arithmétique de chaque chiffre qui le précède — et c’est le test automatisé le plus courant qu’un numéro de carte doit réussir avant que quoi que ce soit d’autre ne se produise. Il a été imaginé chez IBM dans les années 1950 par Hans Peter Luhn, puis est devenu une convention pour les cartes de paiement à travers la norme internationale qui régit la numérotation des cartes.

Cet article explique à quoi sert le chiffre de contrôle, comment le calculer sur papier, pourquoi il attrape la plupart des fautes de frappe, et pourquoi le réussir signifie bien moins de choses qu’on ne l’imagine.

Ce que fait l’algorithme de Luhn

Prenez un numéro de carte, mettez le dernier chiffre de côté, et faites passer les chiffres restants dans une procédure fixe. Le résultat détermine ce que le chiffre final doit être. Un numéro est accepté lorsque le chiffre final est cohérent avec tout ce qui le précède.

Rien dans cette procédure ne fait intervenir une banque, une liste de comptes ou un secret. C’est de l’arithmétique publiée dans les manuels, reproduite dans presque tous les langages de programmation, et calculable en une fraction de milliseconde. Elle répond à exactement une question étroite : cette chaîne contient-elle une erreur de transcription évidente ?

Cette étroitesse est facile à oublier. Parce que la somme de contrôle est le test automatisé le plus visible d’un formulaire de paiement, on finit par croire qu’elle dit plus qu’elle ne dit réellement.

Comment calculer un chiffre de contrôle à la main ?

La procédure se déroule de droite à gauche sur les chiffres qui restent une fois le chiffre final retiré.

  1. Écrivez les chiffres et numérotez leurs positions en partant de la droite, à partir de un.
  2. Doublez chaque chiffre situé à une position paire.
  3. Si une valeur doublée dépasse neuf, soustrayez-lui neuf — ce qui revient à additionner ensemble les deux chiffres du résultat.
  4. Additionnez toutes les valeurs.
  5. Déterminez combien il faudrait ajouter pour atteindre le multiple de dix suivant. Ce montant est le chiffre de contrôle.

Un court exemple rend cela concret. Prenez les cinq chiffres 1, 2, 3, 4 et 5 comme corps d’un numéro plus long et numérotez-les à partir de la droite : le 5 occupe la position un, le 4 la position deux, le 3 la position trois, le 2 la position quatre et le 1 la position cinq. Doubler les positions paires transforme le 4 en 8 et le 2 en 4. Les valeurs sont alors 1, 4, 3, 8 et 5, dont la somme vaut 21. Le multiple de dix suivant est 30, donc le chiffre de contrôle est 9 et la séquence finale se termine par 9.

Faire cela à la main pour un numéro de carte complet est fastidieux mais jamais ambigu. Un logiciel le fait en parcourant la chaîne depuis sa fin, ce qui explique aussi qu’une implémentation qui démarre du mauvais côté rejettera des numéros parfaitement valides.

Pourquoi le doublement attrape-t-il les chiffres transposés ?

La règle du doublement n’est pas arbitraire. Elle fait dépendre le poids de chaque chiffre de sa position, si bien qu’échanger deux voisins modifie généralement le total.

Cela compte parce que les deux erreurs humaines les plus fréquentes sur un champ numérique sont la saisie erronée d’un seul chiffre et la transposition de deux chiffres adjacents. Un chiffre faux décale la somme d’un montant non nul, donc la somme de contrôle échoue presque toujours. Un échange entre voisins décale lui aussi la somme, parce que l’un des deux a été doublé et l’autre ne l’a pas été.

Presque, pas toujours. Quelques échanges sont invisibles à ce contrôle. L’angle mort classique est la paire zéro et neuf côte à côte : doubler neuf et réduire le résultat de neuf redonne neuf, si bien que ces deux chiffres peuvent permuter sans changer le total. D’autres paires se comportent de la même manière. La description exacte du contrôle est donc qu’il attrape toutes les erreurs portant sur un seul chiffre et la plupart, mais pas la totalité, des transpositions adjacentes.

Ce que le chiffre de contrôle ne peut pas vous dire

Il ne peut pas dire si un numéro est réel. Rien dans l’arithmétique ne renvoie à un émetteur, donc n’importe quel préfixe peut être associé à n’importe quels chiffres du milieu et à un chiffre final valide calculé pour correspondre.

Il ne peut pas dire qu’un compte est ouvert, qu’une carte n’a pas été annulée, ou que la personne qui saisit le numéro détient cette carte. Chacune de ces questions nécessite une demande d’autorisation à l’émetteur, ce qui est exactement l’opération qu’un environnement de test doit éviter.

Il ne peut pas non plus se porter garant de la date d’expiration, du nom du titulaire ni du code de sécurité. Ces champs voisinent avec le chiffre de contrôle avec leurs propres règles, et un numéro qui satisfait la somme de contrôle peut être associé à une date déjà passée et à un code qui ne correspond à rien.

C’est la description honnête de ce que renvoie le générateur de ce site : chaque valeur est structurellement valide et cohérente avec cette somme de contrôle, et chacune est un numéro qui n’a jamais été émis à personne.

Où la même somme de contrôle réapparaît

Les cartes de paiement sont l’utilisateur le plus connu de cette méthode, pas le seul. Les schémas de numérotation qui ont besoin d’un garde-fou peu coûteux contre les fautes de frappe recourent souvent à la même arithmétique publique, notamment plusieurs numéros d’identification nationaux, divers systèmes de cartes de fidélité et de cartes cadeaux, et différents identifiants internes.

Cette réutilisation a une conséquence pratique. Un utilitaire partagé qui considère une somme de contrôle réussie comme la preuve qu’il s’agit d’une « carte bancaire » classera mal tout autre élément qui s’avère la satisfaire. Nommez la routine d’après ce qu’elle fait — une somme de contrôle modulo dix — plutôt que d’après le domaine où vous l’avez rencontrée pour la première fois.

Pour les développeurs : ordre des contrôles et pièges fréquents

L’ordre de validation compte plus qu’on ne l’imagine, et la somme de contrôle n’est pas le bon point de départ.

Vérifiez d’abord la longueur, car la procédure n’a aucun avis sur le nombre de chiffres qu’on lui confie ; un fragment de cinq chiffres peut être cohérent avec la somme de contrôle et rester inutilisable. Vérifiez ensuite le jeu de caractères, afin que les lettres, les espaces parasites et les séparateurs soient refusés avant qu’aucune arithmétique ne s’exécute. Calculez la somme de contrôle après cela, et seulement ensuite essayez de reconnaître un réseau à partir du préfixe.

Trois pièges reviennent sans cesse :

  • Traiter un zéro initial comme insignifiant. Les numéros de carte sont des chaînes, pas des entiers, et une conversion numérique peut silencieusement supprimer un chiffre, produisant un échec de somme de contrôle qui n’a rien à voir avec la saisie de l’utilisateur.
  • Exécuter la passe de doublement depuis la gauche. La position est définie depuis la droite, donc la direction fait partie de la spécification plutôt que d’un détail d’implémentation.
  • Signaler une somme de contrôle échouée comme une carte refusée. Cela signifie une entrée mal formée, et le message montré à l’utilisateur devrait le dire ainsi.

Pour les données de test, le schéma utile consiste à conserver des paires : un numéro qui passe et le même numéro avec un chiffre modifié pour qu’il échoue. Cela donne à la suite un cas positif et un cas négatif séparés par exactement un caractère, ce qui rend une régression évidente au premier coup d’œil. Le guide du format couvre les règles de longueur et de préfixe qui doivent s’exécuter avant la somme de contrôle, et le parcours de validation assemble toute la séquence dans l’ordre.

Vérifier une somme de contrôle contre une vraie chaîne

Le moyen le plus rapide de se forger une intuition est de faire passer quelques chaînes dans le générateur de numéros de carte. Générez un lot, modifiez un chiffre à la main et regardez le contrôle échouer ; générez de nouveau et remarquez que seul le chiffre final bouge tandis que tout ce qui le précède reste fixe. La comparaison des réseaux mérite d’être lue ensuite, car la même arithmétique se comporte différemment selon les schémas à quinze et à seize chiffres, et cette différence fait trébucher les utilitaires écrits à la main.

Étapes suivantes

Écrivez votre ordre de validation avant d’écrire le code, avec la somme de contrôle en avant-dernière position, et stockez une fixture volontairement corrompue pour chaque numéro valide de votre suite. Lorsque vous voulez voir comment les longueurs et les préfixes interagissent avec le chiffre final, poursuivez avec le guide du format du numéro de carte.

Continuer la lecture

Articles sur Générateur de numéros de carte bancaire fictifs (cartes de test)