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 dipenuhi dengan sifar di hadapan), menjadikannya sepanjang 22 aksara. Untuk mengira digit cek, jujukan dibentuk terlebih dahulu daripada apa yang dipanggil BBAN (kod bank dan nombor akaun), kod negara berangka \(1314\) untuk Jerman, dan digit cek \(00\) .
Contohnya, kod bank 21050170 dan nombor akaun 12345678 menghasilkan BBAN 210501700012345678. Memperluas ini dengan kod negara dan digit semak 00 menghasilkan \(x = 210501700012345678131400\) , di mana digit semak sekarang ialah: \(98 - (x \mod 97)\) . Pembahagian dengan \(97\) bukanlah sesuatu yang tidak disengajakan. Sebagai nombor perdana dua digit terbesar yang mungkin, ia mengesan ralat seperti digit yang dialihkan kedudukannya dengan kebarangkalian tertinggi yang mungkin. Kami kini akan menunjukkan pemerhatian 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 sini, kita memanfaatkan fakta bahawa kita telah meningkatkan dua digit bersebelahan dalam \(A_1\) sebanyak \(97\) . Tambahan pula, IBAN bukan sahaja sah secara formal, 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.