Vérifier les numéros de carte bancaire, Siret … avec l’Algorithme de LUHN

Un ami a un site web de e-commerce et voulait vérifier les numéros de carte de crédit des utilisateurs.

Dans ce cas d’usage, après quelques recherches, c’est alors l’utilisation de l’Algorithme de LUHN que j’ai choisi car il répond parfaitement au besoin.

exemple de carte de crédit à vérifier

Qu’est ce que l’algorithme de Luhn ?

L’algorithme de Luhn, ou formule de Luhn, est connu également par son nom « mod 10« . Il a été créé dans les années 60 par un ingénieur allemand nommé Hans Peter Luhn, et sa notoriété pris forme lorsque les compagnies bancaires l’adoptèrent en masse.

Cet algorithme permet donc de valider plusieurs type de numéros de comptes comme :

  • les numéros de carte bancaire
  • les numéros d’assurance sociale
  • les numéros IMEI de vos téléphones
  • les numéros SIRET des entreprises.

Attention toutefois ! Il n’est pas utilisé à des fin de hachage sécurisée. Il permet simplement de faire des vérifications contre les erreurs de saisie, et c’est d’ailleurs ce qu’il faut dans notre cas.

Comment se forme l’algorithme ?

Cet algorithme est assez simple à mettre en place pour tous les langages de programmation. Il se décompose comme suit :

1. Doublez un chiffre sur deux en partant de la droite de la carte vers gauche. 
Si ce «doublement» donne un nombre à deux chiffres, soustrayez lui 9 pour obtenir un seul chiffre.

2. Ajoutez tous les numéros à un chiffre de l'étape 1 .

3. Ajoutez tous les chiffres impairs de droite à gauche dans le numéro de carte de crédit.

4. Additionnez les résultats des étapes 2 et 3 .

5. Si le résultat de l'étape 4 est divisible par 10, le numéro de carte est valide; sinon, il est invalide.

Facile non ?

Non ?!? Peut-être pas en effet. Un petit exemple détaillée d’entrée et de sortie par étape :

L'entrée : 4556 7375 8689 9855

Etape 1 : 5x2 , 9x2 , 8x2 , 8x2 , 7x2 ,7x2 , 5x2 , 4x2
        : 10 , 18 , 16 , 16 , 14  , 14 , 10 , 8
        : 1 9 7 7 5 5 1 8

Etape 2 : 1 + 9 + 7 + 7 + 5 + 5 + 1 + 8 = 43

Etape 3 : 5 + 8 + 9 + 6 + 5 + 3 + 6 + 5 = 47

Etape 4 : 43 + 47 = 90

90 étant divisible par 10, le numéro de carte de crédit est valide !

Programmation de l’algorithme en C#

Mais qu’est ce que ça donne si on veut implémenter l’algorithme ? Voici un exemple en C# :

using System;
using System.Linq;
using System.Text.RegularExpressions;

namespace LuhnCreditCardVerificator
{
    public class LuhnVerificator
    {
        public static bool IsVerifCard(string initialInputCard)
        {
            try
            {
                string reverseCard = FormatInput(initialInputCard);
                string card1 = null, card2 = null;
                for (var i = 0; i < reverseCard.Length; i++)
                {
                    var toDoubleDigits = int.Parse(reverseCard[i].ToString()) * 2;
                    var sum = toDoubleDigits.ToString().Sum(c => c - '0');
                    if (i % 2 != 0)
                        card1 += $"{sum.ToString().Substring(0, 1)}";
                    else
                        card2 += $"{reverseCard[i]}";
                }
                int sumNumbersCard = card1.Sum(c => c - '0') + card2.Sum(c => c - '0');
                return sumNumbersCard % 10 == 0;
            }
            catch (Exception)
            {
                return false;
            }
        }
        private static string FormatInput(string initialInputCardNumber)
        {
            string formatInput = Regex.Replace(initialInputCardNumber, "[^a-zA-Z0-9_]+", "", RegexOptions.Compiled);
            return new string(formatInput.ToCharArray().Reverse().ToArray());
        }
    }
}

Ici :

  • Je retourne false si les numéros de la carte de crédit ne sont pas valides
  • Je retourne true si les numéros de la carte de crédit sont valides.

Mon package NUGET en ligne :

Il existe beaucoup de manière de l’implémenter. Ici c’est sûrement une solution perfectible, et que j’ai d’ailleurs perfectionné lorsque j’ai développé mon propre package Nuget pour le mettre à dispostion de tous :

==> nuget.org/packages/LuhnCreditCardVerificator/

N’hésitez pas à le télécharger et à l’utiliser si besoin !

La librairie Ruby (GEM) que j’ai également développé en ligne :

==> https://rubygems.org/gems/luhn_credit_card_verificator

Et le repository GITHUB :

https://github.com/SarahBourgeois/luhn_credit_card_verificator

L’algorithme de LUHN fut dans tous les cas une excellente découverte, et je pense améliorer ce package pour vérifier d’autres éléments comme les numéros Siret.