Tentang kekokohan IBAN

IBAN Jerman terdiri dari kode negara (DE), digit pemeriksa dua digit (sesuai ISO 7064 ), kode bank (8 digit), dan nomor rekening (termasuk nomor sub-rekening, 10 digit, digit yang hilang diisi dengan angka nol di depan), sehingga panjangnya menjadi 22 karakter. Untuk menghitung digit pemeriksa, urutan pertama dibentuk dari apa yang disebut BBAN (kode bank dan nomor rekening), kode negara numerik \(1314\) untuk Jerman, dan digit pemeriksa \(00\) .


Misalnya, kode pengurutan bank 21050170 dan nomor rekening 12345678 memberikan BBAN 210501700012345678, diperluas dengan kode negara dan digit cek 00 lalu menghasilkan \(x = 210501700012345678131400\) , sehingga digit cek sekarang berlaku: \(98 - (x \mod 97)\) . Fakta bahwa ini habis dibagi \(97\) bukanlah sebuah kebetulan. Sebagai bilangan prima dua digit terbesar, kemungkinan besar bilangan ini mendeteksi entri yang salah seperti bilangan yang ditransposisikan. Kami sekarang menunjukkan temuan berikut:

  1. Mengubah satu digit IBAN yang valid akan menghasilkan IBAN yang tidak valid.
  2. Mengubah dua digit berbeda dari IBAN yang valid dapat menghasilkan IBAN yang valid.
  3. Jika dua posisi berbeda dari IBAN yang valid dipertukarkan, IBAN yang tidak valid dibuat.
  4. Jika Anda menukar dua posisi berbeda dari IBAN yang valid dua kali, IBAN yang valid dapat dihasilkan.

Misal $$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 valid.

Maka $$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$$ terkait (diperpanjang dengan kode negara berkode nomor DE dan digit cek \(00\) ).

  1. Ubah Sekarang \(N_k\), adalah \(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) \) tapi adalah \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Umumnya berlaku untuk \( 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\) adalah \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Tapi sekarang \( 0 < R_2 < 97 \) dan dengan demikian \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) dan maka dari itu \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Ini hanya menyisakan satu kemungkinan perubahan angka dari \( P \) ke \( P^* \neq P \). Di sini tapi \( N_k \) tetap tidak berubah, checksum dibuat \( P \neq P^* \).
  2. Dua IBAN berikut ini valid:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Di sini kita mengambil keuntungan dari fakta bahwa kita mengkonversi dua digit yang berdekatan menjadi \(A_1\) . \(97\) telah meningkat. Selain itu, IBAN tidak hanya sah secara formal, tetapi kode bank yang mendasarinya 20730001 dan 20730098 benar-benar ada.
  3. Kita coba dulu, \( N_{k_1} \) dan \( N_{k_2} \) menukar. Pertama adalah \( 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 karena

    $$\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 masih harus diperiksa bahwa \(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 kita \(A_B\) sekitar \(l \cdot 10^{24-k}\) kita harus berubah \(P_1\) atau \(P_2\) sekitar \(-l\), jadi \(P\) sekitar \(-10^m l\) dengan \(m \in \{0,1\}\) ubah: Maka 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,\) dan dengan demikian
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Namun, persamaan ini tidak pernah terpenuhi, seperti yang ditunjukkan oleh skrip berikut::

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

    Ini hanya menyisakan kemungkinan pertukaran \(P_1\) dan \(P_2\). Di sini tapi \( N_k \) tetap tidak berubah, checksum dibuat \( P \neq P^* \).
  4. Dua IBAN berikut ini valid:
    $$\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 benar-benar ada.
Kembali