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:
- Zmiana jednej cyfry prawidłowego numeru IBAN spowoduje powstanie nieprawidłowego numeru IBAN.
- Zmiana dwóch różnych cyfr ważnego numeru IBAN może skutkować uzyskaniem prawidłowego numeru IBAN.
- Jeśli dwie różne pozycje prawidłowego IBAN zostaną zamienione, tworzony jest nieprawidłowy IBAN.
- 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\) ).
- 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^* \).
- 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ą. - 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^* \). - 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.