A propos de la robustesse de l'IBAN

L'IBAN allemand se compose du code pays (DE), d'un chiffre de contrôle à deux chiffres (conformément à la norme ISO 7064 ), du code banque (8 chiffres) et du numéro de compte (incluant le numéro de sous-compte, 10 chiffres, les chiffres manquants étant complétés par des zéros non significatifs), ce qui lui confère une longueur de 22 caractères. Pour calculer le chiffre de contrôle, on forme d'abord une séquence à partir du BBAN (code banque et numéro de compte), du code pays numérique \(1314\) pour l'Allemagne et du chiffre de contrôle \(00\) .


Par exemple, le code bancaire 21050170 et le numéro de compte 12345678 donnent le BBAN 210501700012345678. En ajoutant l'indicatif du pays et le chiffre de contrôle 00, on obtient \(x = 210501700012345678131400\) , où le chiffre de contrôle vaut alors : \(98 - (x \mod 97)\) . La division par \(97\) n'est pas fortuite. Étant le plus grand nombre premier à deux chiffres possible, il détecte les erreurs telles que les inversions de chiffres avec la plus grande probabilité. Nous allons maintenant présenter les observations suivantes.:

  1. La modification d'un chiffre d'un IBAN valide entraînera un IBAN invalide.
  2. La modification de deux chiffres différents d'un IBAN valide peut entraîner un IBAN valide.
  3. Si deux positions différentes d'un IBAN valide sont échangées, un IBAN invalide est créé.
  4. Si vous échangez deux positions différentes d'un IBAN valide deux fois, un IBAN valide peut en résulter.

Soit $$A = DE P_1 P_2 N_1 N_2 N_3 N_4 N_5 N_6 N_7 N_8 N_9 N_{10} N_{11} N_{12} N_{13} N_{14} N_{15} N_{16} N_{17} N_{18}$$ un IBAN valide.

Alors $$A_B = N_1 N_2 N_3 N_4 N_5 N_6 N_7 N_8 N_9 N_{10} N_{11} N_{12} N_{13} N_{14} N_{15} N_{16} N_{17} N_{18} 131400$$ le BBAN associé (prolongé avec le code pays numéroté DE et le chiffre de contrôle \(00\) ).

  1. Change maintenant \(N_k\), est \(A_B^* = A_B + l \cdot 10^{24-k}\) avec \(1 \leq k \leq 18\) et \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Avec \( P = 98 - (A_B \mod 97) \) mais est \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). S'applique généralement à \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Avec \(A_B \equiv R_1 \mod 97\) et \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) est \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Mais maintenant c'est \( 0 < R_2 < 97 \) Et ainsi \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) et donc \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Cela ne laisse qu'un seul changement possible d'un chiffre de \( P \) pour \( P^* \neq P \). Ici mais \( N_k \) reste inchangé, la somme de contrôle est créée \( P \neq P^* \).
  2. Les deux IBAN suivants sont valides :
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Ici, nous tirons parti du fait que nous avons incrémenté de 97 deux chiffres consécutifs dans \(A_1\) \(97\) . De plus, l'IBAN est non seulement formellement valide, mais les codes bancaires sous-jacents 20730001 et 20730098 existent bel et bien.
  3. Nous essayons d'abord, \( N_{k_1} \) et \( N_{k_2} \) à échanger. Le premier est \( P = 98 - (A_B \mod 97) \) comme \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) avec \(l = N_{k_2} - N_{k_1}\) et \(1 \leq k_1, k_2 \leq 18\). C'est maintenant à cause de

    $$\begin{array} {|c|c|} \hline k & R = 10^{24-k} \mod 97 \\ \hline 1 & 56 \\ \hline 2 & 25 \\ \hline 3 & 51 \\ \hline 4 & 73 \\ \hline 5 & 17 \\ \hline 6 & 89 \\ \hline 7 & 38 \\ \hline 8 & 62 \\ \hline 9 & 45 \\ \hline 10 & 53 \\ \hline 11 & 15 \\ \hline 12 & 50 \\ \hline 13 & 5 \\ \hline 14 & 49 \\ \hline 15 & 34 \\ \hline 16 & 81 \\ \hline 17 & 76 \\ \hline 18 & 27 \\ \hline \end{array}$$
    \( \forall k_1 \neq k_2 \in \left\{ 1, \ldots, 18 \right\} : R_{k_1} \neq R_{k_2}\). Ainsi est \( P \neq P^* \). Il reste donc à vérifier que \(P_n\) et \(N_k\) avec \( 1 \leq n \leq 2 \) et \( 1 \leq k \leq 18 \) métiers. Peut-être \(P = 98 - (A_B \mod 97)), (R_1 = (A_B \mod 97)\), \(P^* = 98 - (A_B + (l \cdot 10^{24-k}) \mod 97)\), \(R_2 = (A_B + (l \cdot 10^{24-k}) \mod 97)\). Depuis que nous \(A_B\) environ \(l \cdot 10^{24-k}\) nous devons changer \(P_1\) ou alors \(P_2\) environ \(-l\), alors \(P\) environ \(-10^m l\) avec \(m \in \{0,1\}\) changement : alors est \(P^* = 98 - R_2\) mais aussi \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), En conséquence \(R_2 = R_1 + 10^m l,\) Et ainsi
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Cependant, cette équation n'est jamais remplie, comme le montre le script suivant:

    See the Pen IBAN FORMULA CHECK by David Vielhuber (@vielhuber) on CodePen.

    Cela ne laisse qu'un échange possible de \(P_1\) et \(P_2\). Ici mais \( N_k \) reste inchangé, la somme de contrôle est créée \( P \neq P^* \).
  4. Les deux IBAN suivants sont valides :
    $$\begin{align*}A_1 = DE\boldsymbol{\color{red}8}\boldsymbol{\color{green}3}20220800\boldsymbol{\color{red}1}000000\boldsymbol{\color{green}0}00 \\ A_2 = DE\boldsymbol{\color{red}1}\boldsymbol{\color{green}0}20220800\boldsymbol{\color{red}8}000000\boldsymbol{\color{green}3}00\end{align*}$$ Ici aussi, le BIC 20220800 existe réellement.
Retour