Finance

Comment l'Algorithme de Luhn Valide un Numéro de Carte Bancaire

8 min de lecture

Un numéro de carte bancaire n’est pas une suite de chiffres choisie au hasard : le dernier chiffre est calculé pour que l’ensemble du numéro passe un contrôle mathématique précis, l’algorithme de Luhn. On double un chiffre sur deux en partant de la droite, on ajuste les résultats à deux chiffres, on additionne le tout, et le total doit tomber sur un multiple de 10. Si ce n’est pas le cas, le numéro est mal formé, et c’est détecté avant même qu’un paiement n’atteigne la banque.

La règle

En partant du chiffre le plus à droite et en remontant vers la gauche, on double un chiffre sur deux. Si le doublement donne un résultat à deux chiffres, on soustrait 9 (ce qui revient à additionner les deux chiffres du résultat, donc 16 devient 1+6=7). Les chiffres non touchés restent tels quels. On additionne les seize résultats. Si la somme est un multiple de 10, le numéro passe le contrôle.

C’est tout l’algorithme. Il tourne dans un navigateur, sur un terminal de paiement ou dans la validation côté client d’un formulaire, sans le moindre appel réseau.

Exemple concret : vérifier un numéro de carte étape par étape

Prenons le numéro que la plupart des développeurs ont déjà croisé dans un environnement de test Stripe ou PayPal : 4111 1111 1111 1111. C’est un numéro de test Visa public, pas une vraie carte de client, publiable sans aucun risque.

On numérote les chiffres depuis la droite, de la position 1 à la position 16. Les positions paires sont doublées :

Position (depuis la droite)16151413121110987654321
Chiffre4111111111111111
Doublé ?ouinonouinonouinonouinonouinonouinonouinonouinon
Contribution8121212121212121

La position 16 est paire, donc le premier chiffre, 4, est doublé : 4 x 2 = 8, un résultat à un seul chiffre qui ne demande aucun ajustement. Les sept autres positions doublées contiennent toutes un 1, et 1 x 2 = 2 pour chacune, soit 14 au total (7 x 2). Les huit positions non touchées valent toutes 1, pour un total de 8.

On additionne : 14 (les 1 doublés) + 8 (le 4 doublé) + 8 (les chiffres non touchés) = 30.

30 est un multiple de 10, le numéro passe le contrôle. Ça correspond à la réalité : 4111111111111111 est un authentique numéro de test Visa, largement documenté et utilisé dans le monde entier.

Pourquoi une seule faute de frappe fait échouer le contrôle

Changeons uniquement le dernier chiffre, de 1 à 2 : 4111111111111112, une faute de frappe classique sur le dernier caractère saisi. Ce dernier chiffre occupe la position 1, qui n’est jamais doublée, donc il entre directement dans la somme avec sa valeur faciale.

La somme d’origine, 30, comptait 1 pour ce dernier chiffre. En le remplaçant par 2, la somme devient 31.

31 n’est pas un multiple de 10. Le contrôle échoue immédiatement, côté client, avant que le numéro ne soit même envoyé à un prestataire de paiement. C’est tout l’intérêt de Luhn : un contrôle de cohérence rapide et hors ligne, capable de filtrer les fautes de frappe et les scans mal lus avant qu’ils ne coûtent un aller-retour réseau.

Numéros de test courants par réseau

Chaque grand réseau de cartes publie des numéros de test valides selon Luhn, destinés aux développeurs pour leurs environnements de test. Ces numéros sont sans danger à publier et figurent dans la documentation officielle de Stripe et PayPal.

RéseauNuméro de testChiffres
Visa4111 1111 1111 111116
Visa (alternatif)4012 8888 8888 188116
Mastercard5555 5555 5555 444416
American Express3782 822463 1000515
Discover6011 1111 1111 111716

American Express casse le découpage habituel en groupes de 4 : c’est un numéro à 15 chiffres, groupé 4-6-5, ce qui piège les validateurs qui supposent que toute carte fait 16 chiffres.

Testez avec votre propre numéro

Collez l’un des numéros ci-dessus, ou un numéro à vous, dans le vérificateur ci-dessous. Il applique l’algorithme de Luhn en direct, détecte le réseau à partir du préfixe, et affiche le numéro formaté au fur et à mesure de la saisie.

Réseau -
Checksum de Luhn -

Ce que Luhn ne vous dit pas

Un contrôle de Luhn réussi signifie seulement que le numéro est arithmétiquement bien formé. Ça ne dit rien sur l’existence réelle de la carte, son activation, un éventuel signalement pour vol, ou la présence de fonds derrière. On peut construire autant de numéros valides selon Luhn qu’on veut sans qu’aucun n’ait jamais été émis pour qui que ce soit.

Confirmer qu’une carte est réelle, active et débitable demande une véritable demande d’autorisation auprès de la banque émettrice, via un prestataire de paiement, une étape totalement distincte de ce contrôle de cohérence. Luhn est le premier filtre de la chaîne, le moins coûteux, pas le dernier.

Erreurs courantes et cas particuliers

L’erreur la plus fréquente en production : faire tourner Luhn sur une chaîne qui contient encore des espaces ou des tirets. Il faut ne garder que les chiffres avant de calculer la somme, sinon un numéro parfaitement valide, mais saisi avec des espaces de regroupement, échoue au contrôle pour de mauvaises raisons.

La deuxième : supposer que toute carte fait 16 chiffres. American Express en fait 15, certains numéros Diners Club en font 14, et UnionPay va de 16 à 19 chiffres selon les cas. La longueur seule n’est pas un signal de validité, et Luhn s’en moque complètement : il fonctionne quel que soit le nombre de chiffres qu’on lui donne.

La troisième est plus intéressante : Luhn a un angle mort documenté. Si deux chiffres adjacents sont inversés et que leur différence vaut exactement 9 (autrement dit, un 0 et un 9 côte à côte qui échangent leur place), la somme de contrôle reste identique et l’erreur passe inaperçue. C’est une limite connue de l’algorithme, pas un bug d’implémentation. Le cas reste rare en pratique (il faut déjà avoir un 0 et un 9 adjacents pour commencer), mais ça vaut la peine de le savoir si Luhn est le seul filtre de qualité de saisie sur lequel on compte.

Questions fréquentes

Un numéro valide selon Luhn veut-il dire que la carte est réelle ?

Non. Luhn vérifie seulement que les chiffres sont cohérents entre eux, comme le checksum d’un code-barres confirme juste qu’il a été scanné correctement. Savoir si la carte a réellement été émise, si elle est active, et si elle dispose de fonds ne peut être confirmé que par la banque émettrice lors d’une demande d’autorisation.

Pourquoi soustrait-on 9 quand un chiffre doublé dépasse 9 ?

Doubler un chiffre de 5 à 9 donne toujours un résultat à deux chiffres (10 à 18). La règle de Luhn consiste à additionner les deux chiffres de ce résultat, et soustraire 9 est un raccourci pour exactement ça : pour tout nombre n entre 10 et 18, la somme de ses chiffres vaut n moins 9. Ainsi 8 x 2 = 16, et 1 + 6 = 7, ce qui revient au même que 16 moins 9.

Puis-je utiliser ces mêmes numéros de test pour mon propre formulaire de paiement ?

Oui, c’est exactement leur usage prévu. Stripe, PayPal et la plupart des prestataires de paiement documentent ces mêmes numéros (ou des variantes très proches) pour les environnements de test, et aucun n’appartient à un vrai titulaire de carte. Si votre formulaire rejette 4111 1111 1111 1111 en mode test, le bug se trouve presque toujours dans le parsing ou le contrôle de longueur de votre formulaire, pas dans le numéro lui-même.

Luhn, c’est la même chose que le code de sécurité CVV ?

Non, ce sont deux contrôles complètement différents. Luhn valide le numéro de compte principal lui-même, une propriété purement mathématique des chiffres. Le CVV est un code de sécurité distinct, à 3 ou 4 chiffres, imprimé sur la carte, qui sert à prouver que la personne qui règle la transaction a la carte physiquement en main. Un numéro peut être parfaitement valide selon Luhn et échouer quand même à cause d’un CVV manquant ou erroné.

Validateur de Numéro de Carte de Crédit
Essayez-le maintenant avec l'outil complet.
Essayer maintenant