*********************************** * CARTE BANCAIRE VISA * * Par * * D. O'CONNELL * * Pour * * NO-WAY * *********************************** Ce texte vous es proposé à titre purement informatif, je dégage toutes responsabilitées quand à l'utilisation que vous pouvez en faire. I Généralitées: Une carte bancaire est un moyen de paiement électronique, pour ce faire on dispose de trois solutions, la puce de la carte, les pistes magnétiques ou simplement le numéro de carte en cas de télépaiement (pour les ignares ça veux dire paiement à distance). Le plus sur des moyens étant l'interrogation de la puce, c'est ce qui est utilisé pour les paiements en magasin quand vous tapez votre code. Les pistes magnétiques sont interrogées lors d' un retrait dans un DAB (Distributeur Automatique de Billets) sans vérification de la puce. Le numero de carte est utilisé par les anciens "terminaux" dit fer à repasser où l'embossage de la carte était tranféré par carbonne et pour les prises de commande par téléphone. II Les pistes magnétiques Les cartes VISA comportent plusieurs pistes le standard ISO en definie 3, les cartes françaises en utilisent 4 ISO1, ISO2, et 2 autres propre à la France T2, et T3 bravo la normalisation... Cependant pour des raisons de compatilitée et de coût une seule et utilisée à la fois généralement ISO2 mais parfois ISO1 dans les anciens terminaux. Les informations sont codées en bi-phase le mieux étant de voir le dessin pour comprendre: Signal +---+ +---+ +-+ +-+ + +---+ +-+ +-+ +---+ + +---+ + + +-+ +-+ + +-+ +---+ +-+ + Valeur 0 0 0 1 1 0 1 0 1 0 Simple non ?? Le bit est codé suivant deux fréquence la fréquence pour le 1 étant deux fois celle du 0. Un prochain article intégrera je l'espère le schéma d'un lecteur/écriveur de piste magnétique, sachez qu'une tête magnétique de magnétophone fait trés bien l'affaire pour la lecture. Bon maintenant il faut encore savoir comment interpréter les bits lus, il y a deux standard pour cela: -ANSI/ISO BCD FORMAT BCD signifie Binary Coded Decimal ou Decimal Codé Binaire, le code est sur 5 bits 4 d'information et un de parité. La parité est impaire cela signifie que chaque mot de 5 bits doit comporter un nombre IMPAIRE de 1. La lecture commence, contre toute logique, par le bit le moins significatif!! ----DONNEES---- Parité b1 b2 b3 b4 b5 Caractère Fonction 0 0 0 0 1 0 Donnée 1 0 0 0 0 1 " 0 1 0 0 0 2 " 1 1 0 0 1 3 " 0 0 1 0 0 4 " 1 0 1 0 1 5 " 0 1 1 0 1 6 " 1 1 1 0 0 7 " 0 0 0 1 0 8 " 1 0 0 1 1 9 " 0 1 0 1 1 : Control 1 1 0 1 0 ; Start 0 0 1 1 1 < Control 1 0 1 1 0 = Séparateur 0 1 1 1 0 > Control 1 1 1 1 1 ? Fin Voici donc un code purement numérique, pas évident pour écrire un nom! Mais voici ZORO avec son ANSI/ISO ALPHA FORMAT: --------Données------- Parité b1 b2 b3 b4 b5 b6 b7 Caractère Fonction 0 0 0 0 0 0 1 espace (0H) Spécial 1 0 0 0 0 0 0 ! (1H) " 0 1 0 0 0 0 0 " (2H) " 1 1 0 0 0 0 1 # (3H) " 0 0 1 0 0 0 0 $ (4H) " 1 0 1 0 0 0 1 % (5H) Start 0 1 1 0 0 0 1 & (6H) Spécial 1 1 1 0 0 0 0 ' (7H) " 0 0 0 1 0 0 0 ( (8H) " 1 0 0 1 0 0 1 ) (9H) " 0 1 0 1 0 0 1 * (AH) " 1 1 0 1 0 0 0 + (BH) " 0 0 1 1 0 0 1 , (CH) " 1 0 1 1 0 0 0 - (DH) " 0 1 1 1 0 0 0 . (EH) " 1 1 1 1 0 0 1 / (FH) " 0 0 0 0 1 0 0 0 (10H) Données 1 0 0 0 1 0 1 1 (11H) " 0 1 0 0 1 0 1 2 (12H) " 1 1 0 0 1 0 0 3 (13H) " 0 0 1 0 1 0 1 4 (14H) " 1 0 1 0 1 0 0 5 (15H) " 0 1 1 0 1 0 0 6 (16H) " 1 1 1 0 1 0 1 7 (17H) " 0 0 0 1 1 0 1 8 (18H) " 1 0 0 1 1 0 0 9 (19H) " 0 1 0 1 1 0 0 : (1AH) Spécial 1 1 0 1 1 0 1 ; (1BH) " 0 0 1 1 1 0 0 < (1CH) " 1 0 1 1 1 0 1 = (1DH) " 0 1 1 1 1 0 1 > (1EH) " 1 1 1 1 1 0 0 ? (1FH) FIN 0 0 0 0 0 1 0 @ (20H) Spécial 1 0 0 0 0 1 1 A (21H) Données 0 1 0 0 0 1 1 B (22H) " 1 1 0 0 0 1 0 C (23H) " 0 0 1 0 0 1 1 D (24H) " 1 0 1 0 0 1 0 E (25H) " 0 1 1 0 0 1 0 F (26H) " 1 1 1 0 0 1 1 G (27H) " 0 0 0 1 0 1 1 H (28H) " 1 0 0 1 0 1 0 I (29H) " 0 1 0 1 0 1 0 J (2AH) " 1 1 0 1 0 1 1 K (2BH) " 0 0 1 1 0 1 0 L (2CH) " 1 0 1 1 0 1 1 M (2DH) " 0 1 1 1 0 1 1 N (2EH) " 1 1 1 1 0 1 0 O (2FH) " 0 0 0 0 1 1 1 P (30H) " 1 0 0 0 1 1 0 Q (31H) " 0 1 0 0 1 1 0 R (32H) " 1 1 0 0 1 1 1 S (33H) " 0 0 1 0 1 1 0 T (34H) " 1 0 1 0 1 1 1 U (35H) " 0 1 1 0 1 1 1 V (36H) " 1 1 1 0 1 1 0 W (37H) " 0 0 0 1 1 1 0 X (38H) " 1 0 0 1 1 1 1 Y (39H) " 0 1 0 1 1 1 1 Z (3AH) " 1 1 0 1 1 1 0 [ (3BH) Spécial 0 0 1 1 1 1 1 \ (3DH) Spécial 1 0 1 1 1 1 0 ] (3EH) Spécial 0 1 1 1 1 1 0 ^ (3FH) Separateur 1 1 1 1 1 1 1 _ (40H) Spécial Ouf voila la parité est toujours impaire, et on continue à lire le LSB en premier. On va maintenant s'interesser au données contenues dans dans les pistes ISO1, et ISO2: Les pistes T2 et T3 des cartes française 'seraient' un redit des informations des pistes ISO2 et ISO3, cette information est non vérifiée si vous avez des renseignements.... Numero de la carte -> 1111 2222 3333 4444 Date d'expiration -> 12/99 Piste 2 (BCD,75 bpi)-> ;1111222233334444=9912101xxxxxxxxxxxxx? Piste 1 (ALPHA,210 bpi)-> %B1111222233334444^PUBLIC/JOHN^9912101xxxxxxxxxxxxx? PISTE 1 Champ # Longueur Fonction ------- -------- -------- 1 1 Start Sentinel (STX) 2 1 Format Code 3 13/16 Numero de la carte 4 1 Separateur (^) HEX 5E 5 2-26 Nom du porteur 6 1 Separateur (^) HEX 5E 7 4 Date d'expiration MMAA 8 3 CODE ??? 101 ou 000 pas d'info 9 0/5 Verification du code secret 10 Depend de 3, 5, 9 11 11 Réservé 12 1 FIN (ETX) 13 1 LRC Longueur maximum 79 Caractères Champ # Longueur Fonction ------- -------- ------------- 1 1 Start Sentinel (STX) 2 13/16 Numero de carte 3 1 Separateurr (=) HEX 3D 4 4 Date d'expiration MMAA 5 3 Code ??? 101 ou 000 pas d'info 6 0/5 Vérification du code secret 7 Depend de 2, 6 8 1 Fin (ETX) 9 1 LRC LRC est une sorte de checksum qui est calculé en faisant un XOR sur tout les caractères précédents sauf STX. III Le numéro de carte Le numéro inscrit sur votre carte est son identitée, c'est avec ça que toutes les opérations sont traitées. Pour une carte visa le numéro a 16 chiffres, les 4 premiers identifient l' émetteur de la carte (la banque) les deux suivants ?? les 7 suivants sont le numéro de compte du titulaire, les deux suivants ?? le dernier est attribué de façon mathématique ce qui permettra de vérifier si le numéro de carte est valide ou non. On peut résumer la situation ainsi: BBBB??NNNNNNNXXC B=Code de la banque N=Numéro de compte C=Checksum ?=Aucune idée souvent 59 ou 60 X=Nombre de carte que vous avez eu (à verifier) souvent 01 Les Banques en fonction des 4 premiers chiffres: -4970 La Poste -4975 La Bred -4972 Le Crédit Lyonnais -4976 Banque Sofinco -5131 Crédit Agricole Je n'en connais pas d'autre mais il suffit de regarder sur la votre pour trouver (!!?) Une façon trés simple d'avoir un numéro de compte est de regarder votre relevé de compte chaque fois que l'on vous fait un chéque le numéro de compte sur lequel il a été tiré est inscrit... Voila le programme (en Basic GW) permettant de calculer le numéro d'une visa, pour être sur d'un numéro de carte vous pouvez vous connecter sur Compuserve, ou appeller un numéro de discution porno... (Enjoy your WANKING), ou utiliser un soft shareware appelé Crédit Card Checking (CCC) distribué par l'ASP. ------------------------------------------------------------------------------ DEFINT A-Z DIM buf(15) CLS INPUT "Numéro de la banque (4 chiffres):", bank$ INPUT "Numero de compte (7 chiffres) :", compt$ INPUT "Les 2 chiffres aprés la banque :", chif2$ INPUT "Les 2 chiffres avant le checksum:", chich$ FOR j = 1 TO 3 a$ = MID$(bank$, j, 1) buf(j - 1) = VAL(a$) NEXT j FOR j = 1 TO 2 buf(j + 3) = VAL(MID$(chif2$, j, 1)) NEXT j FOR j = 1 TO 7 buf(j + 5) = VAL(MID$(compt$, j, 1)) NEXT j FOR j = 1 TO 2 buf(j + 12) = VAL(MID$(chich$, j, 1)) NEXT j FOR i = 1 TO 9 modulo = 0 buf(15) = i FOR k = 0 TO 15 IF ((k MOD 2) = (16 MOD 2)) THEN j = 2 * buf(k) ELSE j = buf(k) END IF IF j >= 10 THEN x = (j MOD 10) + 1 ELSE x = j END IF modulo = modulo + x NEXT LOCATE 10, 10 IF modulo = 0 THEN y = 3 END IF IF (modulo MOD 10 = 0) AND (y <> 3) THEN FOR z = 0 TO 15 PRINT buf(z); NEXT PRINT "" PRINT "Modulo=", modulo INPUT z END IF NEXT i ------------------------------------------------------------------------------ C'est du brut, libre à vous de rajouter des fioritures mais ça marche c'est le principal non?? Voila la date d'expiration est simplement un flag à l'arrivée, donc vous pouvez donner n'importe quoi dans la limite de deux ans aprés la date actuelle exemple si on est le 02/94 une date valide est située entre le 03/94 et le 02/96. IV La Puce Bon pas beaucoup d'infos la dessus, c'est un vrai microcontrolleur, avec un processeur 8 bits, de la RAM et de l' EPROM. La désignation officielle est CP8 c'est fabriqué par Bull je ne sais pas si il y a des secondes sources (peut être Schlumberger mais pas Gemplus). La carte est sécurisé par zone, la première zone en accés libre comporte les informations embossées (Nom, Prenom, Numero, Date d'expiration), la seconde zone peut être lu après présentation d'un code c'est la zone de transaction, un compteur comptabilise (comme tout bon compteur) les erreurs de présentation de code aprés 3 erreurs successives même sur des terminaux diffèrents la puce est irrémédiablement bloquée. La troisiéme zone est innaccessible depuis l'exterrieur et comporte les codes de validation des programmes de cryptage qui sont au nombre de 2 RSA et DES pour plus d'information à ce sujet on peut se reporter à l'exellent livre "Cryptography and data security" aux éditions Addison-Wesley. Mais sachez que pour cracker un code DES il vous fraudra quelques siécles avec un DX2-66 et quelques millions de fois plus pour le RSA. Je n' ai jammais entendu parler de fraude sur la puce des CB, peut etre que quelqu'un me contredirra dans un futur (plus ou moins) proche. Voila j'espère que ce petit fichier vous aura interessé, dans un prochain nous nous interesserons au carte F256 qui sont les puces des cartes de téléphones. Les informations ci-dessus viennent de Phrack, Science et Vie, d' articles dans divers jounaux dont j'ai oublié les noms, et du peu de choses interessantes que l' éducation nationnale m'a apporté.