Un numéro de carte bancaire est vérifié par un algorithme appelé clé de Luhn. Le numéro n’est donc pas vraiment créé aléatoirement. Celui-ci est composé de quatre groupes de quatre chiffres que nous définissons suivant le format suivant : ABCD EFGH IJKL MNOP.
- Le premier chiffre A indique le type de carte bancaire : 4 pour Visa, 5 pour Mastercard ou 6 pour Discover.
- La suite de chiffres, BCD,BCDE ou BCDEF est le numéro de la banque. La suite peut-être de longueur plus ou moins grande selon la banque : 978 pour la Poste, 972 pour LCL ou 973 pour la société générale.
- Le numéro suivant jusqu’à O inclus est un nombre choisi aléatoirement par la banque pour désigner un client.
- Le dernier chiffre P correspond à la clé de Luhn permettant de vérifier la validité du numéro de la carte.
Nous allons implémenter cet algorithme puisque celui-ci est public et simple. Prenons un exemple de numéro de carte française afin d’expliquer comment l’algorithme fonctionne :
4978 3482 2390 0633
Ce numéro est purement fictif et la probabilité qu’il existe réellement est faible. Trois étapes sont nécessaires afin de vérifier que ce numéro vérifie l’algorithme de Luhn.
La première étape est de multiplier par 2 la valeur de chaque chiffre à partir de la clé de Luhn (le dernier chiffre, 3 dans notre cas) en partant de la droite et en faisant des sauts de deux (les chiffres en rouge).
<- de droite à gauche
4978 3482 2390 0633
Le résultat donne : (8)9(14)8 (6)4(16)2 (4)3(18)0 (0)6(9)3
La seconde étape est de s’assurer que les résultats de la multiplication (valeurs entre parenthèses et en rouge) soient strictement inférieur à 10. Si une valeur est supérieure ou égale à 10 il faut forcer à ce que la valeur reste un chiffre. Pour ce faire nous pouvons utiliser deux méthodes donnant le même résultat :
additionner chaque chiffre du nombre (15 devient 6 car 1+5=6).
soustraire 9 du nombre.
Nous obtenons alors avec notre numéro : 8958 6472 4390 0633
La troisième et dernière étape est d’additionner tous les chiffres, en faisant attention de bien inclure la clé de Luhn. Ensuite il ne reste plus qu’à calculer le modulo 10 de l’addition effectuée auparavant. Si le résultat obtenu est 0 alors le numéro de la carte bancaire est valide. Dans le cas on nous aurions n’importe quel autre résultat différent de 0 le numéro n’aurait pas été valide.
En reprenant notre exemple, on obtient :
8+9+5+8+6+4+7+2+4+3+9+0+0+6+3+3=80
80 mod 10 = 0
Nous pouvons en conclure que 4978 3482 2390 0633 est un numéro de carte bancaire valide.
A partir ces informations nous avons donc implémenté l’algorithme en PHP. Celui-ci tient sur quelques lignes seulement :
//calcul de la longueur de la chaine $num contenant le numéro de la carte
$longueur = strlen($CBnum);
//variable contenant le résultat de l’addition de tous les chiffres
$tot = 0;
for($i=$longueur-1;$i>=0;$i–) {
$chiffre = substr($CBnum, $i, 1);
//multiplication par 2 de chaque chiffre résultant d’un saut de 2 en partant de la droite
if ((($longueur – $i) % 2) == 0) {
$chiffre = $chiffre*2;
//réduction d’un nombre en le soustrayant à 9
if ($chiffre>9) {
$chiffre = $chiffre-9;
}
}
$tot = $tot+$chiffre;
}
//modulo 10 sur le résultat de l’addition
$res=($tot % 10)
A noter qu’avec toutes ces informations, il est assez facile de réaliser soi même un logiciel de carding et de générer un faux numéro de carte bancaire.