Seperti yang diketahui, IBAN Jerman terdiri daripada kod negara (DE), digit cek dua digit (mengikut ISO 7064 ), kod bank (8 digit) dan nombor akaun (termasuk nombor sub-akaun, 10 -digit, digit yang hilang diisi dengan sifar pendahuluan) dan oleh itu ialah 22 -digit. Untuk mengira digit cek, apa yang dipanggil BBAN (kod bank dan nombor akaun) serta kod negara berangka \(1314\) untuk Jerman dan digit cek \(00\) ) dibentuk.
Sebagai contoh, kod bank 21050170 dan nombor akaun 12345678 mengembalikan BBAN 210501700012345678, dikembangkan dengan kod negara dan digit semakan 00 kemudian menghasilkan \(x = 210501700012345678131400\) , di mana \(x = 210501700012345678131400)\8131400\81345678131400, \ \(98 - (x \mod 97)\) 9) \(98 - (x \mod 97)\) . Bukan kebetulan bahawa ini dibahagikan dengan \(97\) . Sebagai nombor perdana dua digit terbesar yang mungkin, ia mengiktiraf entri yang salah seperti digit alih dengan kebarangkalian yang paling besar. Kami kini menunjukkan pernyataan berikut:
- Menukar satu digit IBAN yang sah akan menyebabkan IBAN tidak sah.
- Menukar dua digit berbeza IBAN yang sah boleh menghasilkan IBAN yang sah.
- Jika dua kedudukan berbeza bagi IBAN yang sah ditukar, IBAN yang tidak sah akan dibuat.
- Jika anda menukar dua kedudukan berbeza bagi IBAN yang sah dua kali, IBAN yang sah boleh terhasil.
Biarkan $$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}$$ IBAN yang sah.
Kemudian $$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$$ yang berkaitan (dilanjutkan dengan kod negara berkod nombor DE dan digit semak \(00\) ).
- Tukar sekarang \(N_k\), ialah \(A_B^* = A_B + l \cdot 10^{24-k}\) dengan \(1 \leq k \leq 18\) dan \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Dengan \( P = 98 - (A_B \mod 97) \) tetapi adalah \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Umumnya terpakai kepada \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Dengan \(A_B \equiv R_1 \mod 97\) dan \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) ialah \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Tetapi sekarang ia adalah \( 0 < R_2 < 97 \) maka dengan itu \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) dan oleh itu \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Ini meninggalkan hanya satu kemungkinan perubahan digit daripada \( P \) kepada \( P^* \neq P \). Di sini tetapi \( N_k \) kekal tidak berubah, checksum dibuat \( P \neq P^* \).
- Dua IBAN berikut adalah sah:
$$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Di sinilah anda mengambil kesempatan , bahawa kami menambah dua digit bersebelahan dalam \(A_1\) sebanyak \(97\) . Di samping itu, IBAN bukan sahaja sah secara rasmi, tetapi kod bank asas 20730001 dan 20730098 sebenarnya wujud. - Kita cuba dulu, \( N_{k_1} \) dan \( N_{k_2} \) untuk bertukar. Pertama ialah \( P = 98 - (A_B \mod 97) \) sebagai \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) dengan \(l = N_{k_2} - N_{k_1}\) dan \(1 \leq k_1, k_2 \leq 18\). Sekarang adalah kerana
$$\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}\). Begitu juga \( P \neq P^* \). Jadi ia masih perlu diperiksa \(P_n\) dan \(N_k\) dengan \( 1 \leq n \leq 2 \) dan \( 1 \leq k \leq 18 \) perdagangan. Mungkin \(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)\). Sejak kami \(A_B\) sekeliling \(l \cdot 10^{24-k}\) kita kena berubah \(P_1\) atau \(P_2\) sekeliling \(-l\), jadi \(P\) sekeliling \(-10^m l\) dengan \(m \in \{0,1\}\) perubahan: Kemudian adalah \(P^* = 98 - R_2\) tetapi juga \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), akibatnya \(R_2 = R_1 + 10^m l,\) maka dengan itu
$$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Walau bagaimanapun, persamaan ini tidak pernah dipenuhi, seperti yang ditunjukkan oleh skrip berikut:See the Pen IBAN FORMULA CHECK by David Vielhuber (@vielhuber) on CodePen.
Ini hanya meninggalkan kemungkinan pertukaran \(P_1\) dan \(P_2\). Di sini tetapi \( N_k \) kekal tidak berubah, checksum dibuat \( P \neq P^* \). - Dua IBAN berikut adalah sah:
$$\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*}$$ Di sini juga, BIC 20220800 sebenarnya wujud.