Om robustheden af ​​IBAN

Det tyske IBAN består som bekendt af landekoden (DE), et tocifret kontrolciffer (ifølge ISO 7064 ), bankkoden (8-cifret) og kontonummeret (inkl. underkontonummer, 10-cifrede, manglende cifre er udfyldt med foranstillede nuller) og er derfor 22-cifrede. For at beregne kontrolcifferet dannes det såkaldte BBAN (bankkode og kontonummer) samt den numeriske landekode \(1314\) for Tyskland og kontrolcifferet \(00\) ).


For eksempel returnerer bankkoden 21050170 og kontonummeret 12345678 BBAN 210501700012345678, udvidet med landekoden og kontrolcifferet 00, så resulterer i \ \(98 - (x \mod 97)\) \(x = 210501700012345678131400\) check cifferet, nu er: \(98 - (x \mod 97)\) . Det er ikke tilfældigt, at dette er divideret med \(97\) . Som det størst mulige tocifrede primtal genkender det forkerte indtastninger såsom transponerede cifre med størst mulig sandsynlighed. Vi viser nu følgende udsagn:

  1. Ændring af et ciffer i et gyldigt IBAN vil resultere i et ugyldigt IBAN.
  2. Ændring af to forskellige cifre i et gyldigt IBAN kan resultere i et gyldigt IBAN.
  3. Hvis to forskellige positioner af et gyldigt IBAN ombyttes, oprettes et ugyldigt IBAN.
  4. Hvis du bytter to forskellige positioner af et gyldigt IBAN to gange, kan det resultere i et gyldigt IBAN.

Lad $$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}$$ et gyldigt IBAN.

Derefter $$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$$ det tilknyttede BBAN (udvidet med den nummerkodede landekode DE og kontrolcifferet \(00\) ).

  1. Skift nu \(N_k\), er \(A_B^* = A_B + l \cdot 10^{24-k}\) med \(1 \leq k \leq 18\) og \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Med \( P = 98 - (A_B \mod 97) \) men er \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Gælder generelt for \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Med \(A_B \equiv R_1 \mod 97\) og \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) er \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Men nu er det \( 0 < R_2 < 97 \) og dermed \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) og derfor \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Dette efterlader kun én mulig ændring af et ciffer fra \( P \) til \( P^* \neq P \). Her men \( N_k \) forbliver uændret, oprettes kontrolsummen \( P \neq P^* \).
  2. Følgende to IBAN er gyldige:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Det er her du drager fordel , at vi øgede to tilstødende cifre i \(A_1\) med \(97\) . Derudover er IBAN ikke kun formelt gyldigt, men de underliggende bankkoder 20730001 og 20730098 eksisterer faktisk.
  3. Vi prøver først, \( N_{k_1} \) og \( N_{k_2} \) at bytte. Først er \( P = 98 - (A_B \mod 97) \) som \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) med \(l = N_{k_2} - N_{k_1}\) og \(1 \leq k_1, k_2 \leq 18\). Nu er det pga

    $$\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}\). Det er også \( P \neq P^* \). Så det mangler at blive tjekket \(P_n\) og \(N_k\) med \( 1 \leq n \leq 2 \) og \( 1 \leq k \leq 18 \) handler. Måske \(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)\). Siden vi \(A_B\) rundt om \(l \cdot 10^{24-k}\) vi er nødt til at ændre os \(P_1\) eller \(P_2\) rundt om \(-l\), så \(P\) rundt om \(-10^m l\) med \(m \in \{0,1\}\) ændre: Så er \(P^* = 98 - R_2\) men også \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), følgelig \(R_2 = R_1 + 10^m l,\) og dermed
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Denne ligning er dog aldrig opfyldt, som det følgende script viser:

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

    Dette efterlader kun en mulig udveksling af \(P_1\) og \(P_2\). Her men \( N_k \) forbliver uændret, oprettes kontrolsummen \( P \neq P^* \).
  4. Følgende to IBAN er gyldige:
    $$\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*}$$ Også her eksisterer BIC 20220800 faktisk.
Tilbage