Menu

Structure IBAN et le contrôle mod-97 expliqués

La structure d'un IBAN se compose d'un code pays, de deux chiffres de contrôle ISO et d'une partie de compte nationale dont chaque pays définit la disposition. L'arithmétique mod-97 relie ces trois éléments.

Publié le

  • validation
  • IBAN
  • chiffre de contrôle

Un IBAN est l’un des rares identifiants dont la grammaire interne est publiée dans son intégralité. Lisez-le de gauche à droite et vous traversez trois zones : un code pays, une paire de chiffres de contrôle, puis la partie de compte nationale. Les deux premières zones sont identiques partout, tandis que la troisième change de forme d’un pays à l’autre.

C’est ce mélange qui rend l’identifiant à la fois facile à analyser et facile à mal valider. Cet article sépare les parties, explique l’arithmétique mod-97 qui les relie et montre pourquoi l’arithmétique est la chose la moins intéressante que la chaîne ait à vous dire.

Quelles sont les parties d’un IBAN ?

Le sigle signifie numéro de compte bancaire international, et l’objectif de conception était de permettre à une seule chaîne de porter assez d’informations pour qu’un virement transfrontalier soit acheminé sans fiche d’instructions séparée.

Position Partie Qui la définit
Les deux premiers caractères Code pays Une liste internationale normalisée de codes à deux lettres
Les deux caractères suivants Chiffres de contrôle La norme IBAN elle-même, identique dans tous les pays
Tout ce qui suit Partie de compte nationale, souvent appelée BBAN L’autorité nationale du pays concerné

Le code pays indique quelles règles nationales s’appliquent ; les deux chiffres indiquent si la chaîne a survécu intacte à la transmission ; le reste est le compte tel que le pays lui-même l’écrit. Seule la zone du milieu est normalisée par les règles IBAN, et seule la zone du milieu peut être vérifiée sans connaître la disposition du pays.

Les exemples utilisés tout au long de cet article sont délibérément des valeurs de substitution synthétiques, choisies pour montrer comment les parties s’emboîtent. Aucun d’eux n’est un identifiant de compte réel, et rien ici ne doit être lu comme l’affirmation qu’un compte particulier existe.

Code pays et les deux chiffres de contrôle ISO

Les deux chiffres qui suivent le code pays proviennent d’un système international de caractères de contrôle, la disposition MOD 97-10 qui appartient à la famille étudiée dans les algorithmes de chiffre de contrôle. Comme l’arithmétique replie toute la chaîne dans ces deux positions, modifier tout autre caractère les invalide.

Cette propriété explique pourquoi il vaut la peine de calculer la paire même lorsque la disposition nationale est inconnue. Une routine peut vérifier les quatre premiers caractères par rapport au reste de la chaîne et conclure sur l’intégrité de la transmission sans posséder la moindre spécification nationale. Ce qu’elle ne peut pas faire, c’est décider si la longueur convient au pays nommé, car cette longueur réside dans les règles nationales.

Au sein de ces règles nationales, les champs varient considérablement. Un pays peut regrouper un code bancaire et un numéro de compte dans un nombre fixe de positions ; un autre peut ajouter une agence, un marqueur de devise ou un chiffre de contrôle national. La norme IBAN consigne la longueur totale de la chaîne de chaque pays, mais la signification de chaque champ interne reste du ressort du pays qui l’a défini.

Pourquoi le BBAN porte-t-il souvent aussi un chiffre de contrôle national ?

Parce que la partie de compte était généralement un numéro national opérationnel bien avant d’être intégrée à un format transfrontalier. Les banques avaient déjà bâti leur propre garde contre les erreurs de transcription, et l’enveloppe internationale ne l’a pas supprimée. Le résultat est une chaîne portant deux contrôles indépendants : la paire internationale au début et ce que le pays a placé à l’intérieur.

Les deux sont calculés à partir de matières différentes, donc ils échouent pour des raisons différentes. Un code pays corrompu casse la paire internationale ; un chiffre de compte mal saisi à l’intérieur de la partie nationale peut casser soit le contrôle national, soit la paire internationale, soit les deux, selon l’endroit où il se trouve. Lorsqu’un validateur signale que le format est correct mais que le contrôle a échoué, l’explication habituelle est que la partie nationale et son contrôle ne s’accordent plus.

Pour un implémenteur, cela signifie que la même chaîne peut être correcte à un niveau et erronée à un autre, et un message qui confond les deux ne suffit pas. Dites quel contrôle a échoué, et dites quelle partie de la chaîne il couvre — l’emplacement du problème est l’information dont l’utilisateur a besoin.

Convertir les lettres en nombres : l’idée derrière mod-97

L’arithmétique a besoin de chiffres, mais la chaîne commence par des lettres. Le pont est une substitution : chaque lettre est remplacée par un nombre selon une règle publiée fixe, après que les quatre premiers caractères ont été déplacés à la fin de la chaîne. Toute la valeur transformée est ensuite divisée par quatre-vingt-dix-sept, et un identifiant valide est celui qui laisse un reste déterminé.

Réorganiser plutôt qu’ajouter est la partie subtile. Déplacer le code pays et les chiffres de contrôle à la fin signifie que les chiffres à vérifier se trouvent à la fin du nombre à diviser, de sorte qu’ils influencent directement le reste. C’est ce qui permet aux deux chiffres de tête de servir de contrôle sur tout ce qui les suit.

Deux conséquences en découlent pour quiconque écrit du code. Premièrement, la valeur transformée est bien plus longue que ce que tout type entier ordinaire peut contenir, si bien que la division doit être effectuée chiffre par chiffre ou avec un dispositif de grands nombres ; les tentatives de la faire avec un simple entier 64 bits débordent silencieusement et produisent des absurdités sur certaines entrées. Deuxièmement, les lettres doivent être converties avec la correspondance publiée exacte — des approximations telles qu’un rang alphabétique commençant à un donnent un reste qui semble plausible et qui est simplement faux.

Pourquoi un contrôle réussi ne prouve-t-il pas qu’un compte existe ?

L’arithmétique mod-97 compare la chaîne avec elle-même. Elle n’a aucune connaissance d’une banque, d’un client ou d’un compte, et personne dans une institution émettrice n’est consulté lors de son exécution. Une valeur peut satisfaire parfaitement l’arithmétique et n’appartenir à aucun compte, car satisfaire l’arithmétique est exactement ce que tout générateur fait par conception.

Vérifier qu’un compte est ouvert et joignable est une opération différente, avec un profil de coût différent. Elle nécessite une consultation d’un annuaire en direct, qui peut être limitée en débit, indisponible en dehors des heures ouvrables et exiger une relation contractuelle pour être appelée. Ce sont les préoccupations d’une frontière entre client et serveur, pas celles d’une routine de somme de contrôle.

Le message d’erreur honnête décrit donc la chaîne. Il peut dire que le format correspondait et que les chiffres de contrôle tenaient, ou que la longueur ne correspond pas au code pays indiqué. Il ne doit pas dire que le compte existe, et il ne doit pas laisser entendre qu’un contrôle échoué signifie que le compte est fermé ou frauduleux.

Pour les développeurs : routage par pays et par longueur

L’implémentation est surtout de la tenue de registres, et c’est là que se nichent les bogues.

  1. Normalisez d’abord l’entrée : retirez les espaces et les tirets et ramenez les lettres à une seule casse.
  2. Lisez le code pays et recherchez-le. S’il est inconnu, signalez un schéma inconnu plutôt qu’un contrôle échoué.
  3. Comparez la longueur totale avec la longueur définie par le pays, et arrêtez-vous là si elles ne correspondent pas — l’arithmétique n’a pas de sens sur une chaîne de mauvaise taille.
  4. Exécutez la transformation mod-97 et comparez le reste, en utilisant une routine chiffre par chiffre ou à grands nombres.
  5. Vérifiez tout chiffre de contrôle national à l’intérieur de la partie de compte avec sa propre règle.

Gardez la table des pays sous forme de données, car les longueurs et les dispositions changent, et gardez les deux verdicts séparés dans la valeur de retour : un pays non pris en charge n’est pas un compte invalide. Lorsqu’un utilisateur colle une valeur provenant d’une source non fiable, rappelez-vous que la normalisation retire la présentation et rien d’autre ; ce n’est pas une étape de réparation.

Étapes suivantes

Prenez un pays que votre produit prend en charge, notez ce que contient sa disposition nationale et relisez la chaîne avec cela en tête. Vérifiez ensuite une valeur de bout en bout dans l’outil de validation de numéros, et lisez les numéros sans chiffre de contrôle pour le cas opposé, où un format est tout ce qu’un validateur pourra jamais confirmer.

Continuer la lecture

Articles sur Validateur de numéros de carte et d'identité