Over de robuustheid van de IBAN

Het Duitse IBAN bestaat uit de landcode (DE), een tweecijferig controlecijfer (volgens ISO 7064 ), de bankcode (8 cijfers) en het rekeningnummer (inclusief subrekeningnummer, 10 cijfers, ontbrekende cijfers aangevuld met voorloopnullen), waardoor het 22 tekens lang is. Om het controlecijfer te berekenen, wordt eerst een reeks gevormd uit het zogenaamde BBAN (bankcode en rekeningnummer), de numerieke landcode \(1314\) voor Duitsland en het controlecijfer \(00\) .


Bijvoorbeeld, de bankcode 21050170 en het rekeningnummer 12345678 leveren het BBAN 210501700012345678 op. Door dit uit te breiden met de landcode en het controlecijfer 00 krijgen we \(x = 210501700012345678131400\) , waarbij het controlecijfer nu is: \(98 - (x \mod 97)\) . De deling door \(97\) is geen toeval. Als het grootste mogelijke tweecijferige priemgetal detecteert het fouten zoals verwisselde cijfers met de hoogst mogelijke waarschijnlijkheid. We zullen nu de volgende observaties laten zien.:

  1. Het wijzigen van één cijfer van een geldig IBAN resulteert in een ongeldig IBAN.
  2. Het wijzigen van twee verschillende cijfers van een geldige IBAN kan resulteren in een geldige IBAN.
  3. Als twee verschillende posities van een geldige IBAN worden verwisseld, wordt een ongeldige IBAN aangemaakt.
  4. Als u twee verschillende posities van een geldige IBAN twee keer omwisselt, kan een geldige IBAN ontstaan.

Laat $$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}$$ een geldig IBAN.

Dan $$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$$ de bijbehorende BBAN (uitgebreid met de gecodeerde landcode DE en het controlecijfer \(00\) ).

  1. Verander nu \(N_k\), is \(A_B^* = A_B + l \cdot 10^{24-k}\) met \(1 \leq k \leq 18\) en \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Met \( P = 98 - (A_B \mod 97) \) maar is \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Over het algemeen van toepassing op: \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Met \(A_B \equiv R_1 \mod 97\) en \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) is \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Maar nu is het \( 0 < R_2 < 97 \) en daarom \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) en daarom \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Dit laat slechts één mogelijke verandering van een cijfer over van \( P \) tot \( P^* \neq P \). Hier maar \( N_k \) blijft ongewijzigd, de controlesom wordt gemaakt \( P \neq P^* \).
  2. De volgende twee IBAN-nummers zijn geldig:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Hier maken we gebruik van het feit dat we twee aangrenzende cijfers in \(A_1\) met \(97\) hebben verhoogd. Bovendien is het IBAN niet alleen formeel geldig, maar bestaan de onderliggende bankcodes 20730001 en 20730098 ook daadwerkelijk.
  3. We proberen eerst, \( N_{k_1} \) en \( N_{k_2} \) te ruilen. De eerste is \( P = 98 - (A_B \mod 97) \) net zo \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) met \(l = N_{k_2} - N_{k_1}\) en \(1 \leq k_1, k_2 \leq 18\). Nu is vanwege

    $$\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}\). Zo is \( P \neq P^* \). Dus dat moet nog worden gecontroleerd \(P_n\) en \(N_k\) met \( 1 \leq n \leq 2 \) en \( 1 \leq k \leq 18 \) handelt. Misschien \(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)\). Sinds we \(A_B\) rondom \(l \cdot 10^{24-k}\) we moeten veranderen \(P_1\) of \(P_2\) rondom \(-l\), dus \(P\) rondom \(-10^m l\) met \(m \in \{0,1\}\) veranderen: Dan is \(P^* = 98 - R_2\) maar ook \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), bijgevolg \(R_2 = R_1 + 10^m l,\) en daarom
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Aan deze vergelijking wordt echter nooit voldaan, zoals het volgende script laat zien:

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

    Dit laat alleen een mogelijke uitwisseling van \(P_1\) en \(P_2\). Hier maar \( N_k \) blijft ongewijzigd, de controlesom wordt gemaakt \( P \neq P^* \).
  4. De volgende twee IBAN's zijn geldig:
    $$\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*}$$ Ook hier bestaat de BIC 20220800 daadwerkelijk.
Terug