O solidności IBAN

Jak dobrze wiadomo, niemiecki IBAN składa się z kodu kraju (DE), dwucyfrowej cyfry kontrolnej (zgodnie z ISO 7064 ), kodu banku (8-cyfrowego) oraz numeru konta (w tym numeru subkonta, 10-cyfrowe, brakujące cyfry są uzupełniane zerami wiodącymi), a zatem są 22-cyfrowe. Aby obliczyć cyfrę kontrolną, tworzy się tzw. BBAN (kod banku i numer konta) oraz numeryczny kod kraju \(1314\) dla Niemiec i cyfrę kontrolną \(00\) ).


Na przykład kod banku 21050170 i numer konta 12345678 zwracają BBAN 210501700012345678, rozszerzone o kod kraju i cyfrę kontrolną 00, co daje wynik \(x = 210501700012345678131400\) , gdzie cyfrą kontrolną jest teraz: \(98 - (x \mod 97)\) . To nie przypadek, że jest to podzielone przez \(97\) . Jako największa możliwa dwucyfrowa liczba pierwsza, z największym prawdopodobieństwem rozpoznaje nieprawidłowe wpisy, takie jak transponowane cyfry. Pokażemy teraz następujące stwierdzenia:

  1. Zmiana jednej cyfry prawidłowego numeru IBAN spowoduje powstanie nieprawidłowego numeru IBAN.
  2. Zmiana dwóch różnych cyfr ważnego numeru IBAN może skutkować uzyskaniem prawidłowego numeru IBAN.
  3. Jeśli dwie różne pozycje prawidłowego IBAN zostaną zamienione, tworzony jest nieprawidłowy IBAN.
  4. Jeśli zamienisz dwie różne pozycje ważnego numeru IBAN dwa razy, może to spowodować uzyskanie ważnego numeru IBAN.

Niech $$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}$$ prawidłowy numer IBAN.

Wtedy $$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$$ skojarzony BBAN (rozszerzony o kod kraju DE i cyfrę kontrolną \(00\) ).

  1. Zmień teraz \(N_k\), jest \(A_B^* = A_B + l \cdot 10^{24-k}\) z \(1 \leq k \leq 18\) oraz \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Z \( P = 98 - (A_B \mod 97) \) ale jest \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Ogólnie dotyczy \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Z \(A_B \equiv R_1 \mod 97\) oraz \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) jest \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Ale teraz jest \( 0 < R_2 < 97 \) a zatem \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) i dlatego \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Pozostaje tylko jedna możliwa zmiana cyfry z \( P \) do \( P^* \neq P \). Tutaj, ale \( N_k \) pozostaje bez zmian, suma kontrolna jest tworzona \( P \neq P^* \).
  2. Następujące dwa numery IBAN są ważne:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Tutaj możesz skorzystać , że zwiększyliśmy dwie sąsiednie cyfry w \(A_1\) o \(97\) . Ponadto IBAN jest nie tylko ważny formalnie, ale kody banku bazowego 20730001 i 20730098 faktycznie istnieją.
  3. Najpierw próbujemy, \( N_{k_1} \) oraz \( N_{k_2} \) zamienić. Pierwszy to \( P = 98 - (A_B \mod 97) \) tak jak \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) z \(l = N_{k_2} - N_{k_1}\) oraz \(1 \leq k_1, k_2 \leq 18\). Teraz jest z powodu

    $$\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}\). Więc jest \( P \neq P^* \). Pozostaje więc sprawdzić, czy \(P_n\) oraz \(N_k\) z \( 1 \leq n \leq 2 \) oraz \( 1 \leq k \leq 18 \) transakcje. Być może \(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)\). Odkiedy \(A_B\) na około \(l \cdot 10^{24-k}\) musimy się zmienić \(P_1\) lub \(P_2\) na około \(-l\), więc \(P\) na około \(-10^m l\) z \(m \in \{0,1\}\) zmiana: to jest \(P^* = 98 - R_2\) ale również \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), w konsekwencji \(R_2 = R_1 + 10^m l,\) a zatem
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Jednak to równanie nigdy nie jest spełnione, jak pokazuje poniższy skrypt::

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

    Pozostawia to tylko możliwą wymianę \(P_1\) oraz \(P_2\). Tutaj, ale \( N_k \) pozostaje bez zmian, suma kontrolna jest tworzona \( P \neq P^* \).
  4. Następujące dwa numery IBAN są ważne:
    $$\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*}$$ Tutaj również BIC 20220800 faktycznie istnieje.
Plecy