Over de robuustheid van de IBAN

Zoals bekend bestaat het Duitse IBAN uit de landcode (DE), een tweecijferig controlecijfer (volgens ISO 7064 ), de bankcode (8 cijfers) en het rekeningnummer (inclusief subrekeningnummer, 10 -cijfer, ontbrekende cijfers worden opgevuld met voorloopnullen) en is daarom 22 -cijferig. Om het controlecijfer te berekenen, worden zowel de zogenaamde BBAN (bankcode en rekeningnummer) als de numerieke landcode \(1314\) voor Duitsland en het controlecijfer \(00\) ) gevormd.


Bijvoorbeeld, de bankcode 21050170 en het rekeningnummer 12345678 retourneren de BBAN 210501700012345678, uitgebreid met de landcode en het controlecijfer 00 resulteert dan in \(x = 210501700012345678131400\) , waarbij het controlecijfer nu is: \(98 - (x \mod 97)\) . Het is geen toeval dat dit wordt gedeeld door \(97\) . Als het grootst mogelijke priemgetal van twee cijfers herkent het onjuiste invoer, zoals getransponeerde cijfers, met de grootst mogelijke waarschijnlijkheid. We laten nu de volgende uitspraken 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's zijn geldig:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Hier profiteert u van , dat we twee aangrenzende cijfers in \(A_1\) hebben verhoogd met \(97\) . Daarnaast 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