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.:
- La modification d'un chiffre d'un IBAN valide entraînera un IBAN invalide.
- La modification de deux chiffres différents d'un IBAN valide peut entraîner un IBAN valide.
- Si deux positions différentes d'un IBAN valide sont échangées, un IBAN invalide est créé.
- 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\) ).
- 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^* \).
- 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. - 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^* \). - 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.