Om robustheten hos IBAN

Det tyska IBAN-numret består av landsnumret (DE), en tvåsiffrig kontrollsiffra (enligt ISO 7064 ), bankkoden (8 siffror) och kontonumret (inklusive underkontonummer, 10 siffror, saknade siffror utfyllda med inledande nollor), vilket gör det 22 tecken långt. För att beräkna kontrollsiffran bildas först en sekvens av det så kallade BBAN (bankkod och kontonummer), den numeriska landsnumret \(1314\) för Tyskland och kontrollsiffran \(00\) .


Till exempel ger bankkoden 21050170 och kontonumret 12345678 BBAN 210501700012345678. Om detta utökas med landskoden och kontrollsiffran 00 får man \(x = 210501700012345678131400\) , där kontrollsiffran nu är: \(98 - (x \mod 97)\) . Divisionen med \(97\) är inte en slump. Som det största möjliga tvåsiffriga primtalet detekterar det fel som transponerade siffror med högsta möjliga sannolikhet. Vi ska nu visa följande observationer.:

  1. Ändring av en siffra i ett giltigt IBAN kommer att resultera i ett ogiltigt IBAN.
  2. Att ändra två olika siffror i ett giltigt IBAN kan resultera i ett giltigt IBAN.
  3. Om två olika positioner av ett giltigt IBAN byts ut, skapas ett ogiltigt IBAN.
  4. Om du byter två olika positioner av ett giltigt IBAN två gånger, kan ett giltigt IBAN resultera.

Låt $$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}$$ ett giltigt IBAN.

Sedan $$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 associerade BBAN (förlängt med den nummerkodade landskoden DE och kontrollsiffran \(00\) ).

  1. Byt nu \(N_k\), är \(A_B^* = A_B + l \cdot 10^{24-k}\) med \(1 \leq k \leq 18\) och \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Med \( P = 98 - (A_B \mod 97) \) men är \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Gäller i allmänhet \( 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\) och \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) är \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Men nu är det så \( 0 < R_2 < 97 \) och sålunda \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) och därför \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Detta lämnar bara en möjlig ändring av en siffra från \( P \) till \( P^* \neq P \). Här men \( N_k \) förblir oförändrad skapas kontrollsumman \( P \neq P^* \).
  2. Följande två IBAN-nummer är giltiga:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Här utnyttjar vi det faktum att vi har ökat två intilliggande siffror i \(A_1\) med \(97\) . Dessutom är IBAN-numret inte bara formellt giltigt, utan de underliggande bankkoderna 20730001 och 20730098 existerar faktiskt.
  3. Vi försöker först, \( N_{k_1} \) och \( N_{k_2} \) att byta. Först är \( 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}\) och \(1 \leq k_1, k_2 \leq 18\). Nu är på grund av

    $$\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}\). Så är det \( P \neq P^* \). Så det återstår att kolla upp det \(P_n\) och \(N_k\) med \( 1 \leq n \leq 2 \) och \( 1 \leq k \leq 18 \) handlar. Kanske \(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)\). Eftersom vi \(A_B\) runt omkring \(l \cdot 10^{24-k}\) vi måste ändra oss \(P_1\) eller \(P_2\) runt omkring \(-l\), så \(P\) runt omkring \(-10^m l\) med \(m \in \{0,1\}\) ändra: Då är \(P^* = 98 - R_2\) men också \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), följaktligen \(R_2 = R_1 + 10^m l,\) och sålunda
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Denna ekvation är dock aldrig uppfylld, vilket följande manus visar:

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

    Detta lämnar bara ett möjligt utbyte av \(P_1\) och \(P_2\). Här men \( N_k \) förblir oförändrad skapas kontrollsumman \( P \neq P^* \).
  4. Följande två IBAN är giltiga:
    $$\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*}$$ Även här finns faktiskt BIC 20220800.
Tillbaka