Über die Robustheit der IBAN

Die deutsche IBAN besteht bekanntlich aus Ländercode (DE), einer zweistelligen Prüfziffer (gemäß ISO 7064), der Bankleitzahl (8-stellig) sowie der Kontonummer (inkl. Unterkontonummer, 10-stellig, fehlende Stellen mit führenden Nullen aufgefüllt) und ist damit 22-stellig. Zur Berechnung der Prüfziffer wird zunächst die sog. BBAN (Bankleitzahl und Kontonummer) sowie der numerischen Länderkennung \(1314\) für Deutschland sowie der Prüfziffer \(00\)) gebildet.


So liefern beispielsweise die Bankleitzahl 21050170 und die Kontonummer 12345678 die BBAN 210501700012345678, erweitert mit dem Ländercode und der Prüfziffer 00 ergibt sich dann \(x = 210501700012345678131400\), wobei nun für die Prüfziffer gilt: \(98 - (x \mod 97)\). Das hier durch \(97\) geteilt wird, ist kein Zufall. Als größtmögliche zweistellige Primzahl erkennt sie mit möglichst großer Wahrscheinlichkeit Fehleingaben wie Zahlendreher. Wir zeigen nun die nachfolgenden Feststellungen:

  1. Verändert man eine Stelle einer gültigen IBAN, entsteht zwingend eine ungültige IBAN.
  2. Verändert man zwei unterschiedliche Stellen einer gültigen IBAN, kann eine gültige IBAN entstehen.
  3. Vertauscht man zwei unterschiedliche Stellen einer gültigen IBAN, entsteht zwingend eine ungültige IBAN.
  4. Vertauscht man zwei Mal zwei unterschiedliche Stellen einer gültigen IBAN, kann eine gültige IBAN entstehen.

Sei $$A = D E 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}$$ eine gültige IBAN.

Dann ist $$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$$ die zugehörige BBAN (erweitert mit der durch Zahlen kodierten Länderkennung DE sowie der Prüfziffer \(00\)).

  1. Ändert man nun \(N_k\), ist \(A_B^* = A_B + l \cdot 10^{24-k}\) mit \(1 \leq k \leq 18\) und \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Mit \( P = 98 - (A_B \mod 97) \) ist aber \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Allgemein gilt für \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Mit \(A_B \equiv R_1 \mod 97\) und \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) ist \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Nun ist aber \( 0 < R_2 < 97 \) und damit \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) und deshalb \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Damit bleibt nur noch eine mögliche Änderung einer Stelle von \( P \) zu \( P^* \neq P \). Da aber \( N_k \) unverändert bleibt, entsteht zwingend die Prüfsumme \( P \neq P^* \).
  2. Die beiden folgenden IBANs sind gültig:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Hier macht man sich zu Nutze, dass wir zwei benachbarte Ziffern in \(A_1\) um \(97\) erhöht haben. Außerdem ist die IBAN nicht nur formal gültig, sondern die zu Grunde liegenden Bankleitzahlen 20730001 sowie 20730098 existieren tatsächlich.
  3. Wir versuchen zunächst, \( N_{k_1} \) und \( N_{k_2} \) zu vertauschen. Zunächst ist \( P = 98 - (A_B \mod 97) \) sowie \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) mit \(l = N_{k_2} - N_{k_1}\) und \(1 \leq k_1, k_2 \leq 18\). Nun ist wegen

    $$\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}\). Damit ist \( P \neq P^* \). Somit bleibt zu prüfen, dass man \(P_n\) und \(N_k\) mit \( 1 \leq n \leq 2 \) und \( 1 \leq k \leq 18 \) tauscht. Sei \(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)\). Da wir \(A_B\) um \(l \cdot 10^{24-k}\) verändern, müssen wir \(P_1\) oder \(P_2\) um \(-l\), also \(P\) um \(-10^m l\) mit \(m \in \{0,1\}\) verändern: Dann ist \(P^* = 98 - R_2\) aber auch \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), mithin \(R_2 = R_1 + 10^m l,\) und damit
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Diese Gleichung ist aber niemals erfüllt, wie folgendes Script zeigt:

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

    Damit bleibt nur noch ein möglicher Tausch von \(P_1\) und \(P_2\). Da aber \( N_k \) unverändert bleibt, entsteht zwingend die Prüfsumme \( P \neq P^* \).
  4. Die beiden folgenden IBANs sind gültig:
    $$\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*}$$ Auch hier existiert die BIC 20220800 tatsächlich.
Zurück