IBAN Jerman kasusun saka kode negara (DE), digit cek rong digit (miturut ISO 7064 ), kode bank (8 digit), lan nomer rekening (kalebu nomer sub-rekening, 10 digit, digit sing ilang diisi karo nol ing ngarep), dadi dawane 22 karakter. Kanggo ngetung digit cek, urutan digawe dhisik saka sing diarani BBAN (kode bank lan nomer rekening), kode negara numerik \(1314\) kanggo Jerman, lan digit cek \(00\) .
Umpamane, kode bank 21050170 lan nomer rekening 12345678 ngasilake BBAN 210501700012345678. Ngembangake iki nganggo kode negara lan digit cek 00 bakal ngasilake \(x = 210501700012345678131400\) , ing ngendi digit cek saiki: \(98 - (x \mod 97)\) . Pambagian karo \(97\) ora disengaja. Minangka nomer prima rong digit paling gedhe, iki ndeteksi kesalahan kayata digit sing ditransposisi kanthi kemungkinan paling dhuwur. Saiki kita bakal nuduhake pengamatan ing ngisor iki.:
- Ngganti siji digit saka IBAN sing bener bakal nyebabake IBAN sing ora bener.
- Ngganti rong digit beda saka IBAN sing bener bisa nyebabake IBAN sing bener.
- Yen rong posisi beda saka IBAN sing sah diganti, IBAN sing ora sah digawe.
- Yen sampeyan ngganti rong posisi beda saka IBAN sing sah kaping pindho, IBAN sing sah bisa kasil.
Ayo $$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 sing sah.
Banjur $$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$$ sing digandhengake (ditambahi karo kode negara kode DE lan digit mriksa \(00\) ).
- Ganti saiki \(N_k\), punika \(A_B^* = A_B + l \cdot 10^{24-k}\) karo \(1 \leq k \leq 18\) lan \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Karo \( P = 98 - (A_B \mod 97) \) nanging punika \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Umume ditrapake kanggo \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Karo \(A_B \equiv R_1 \mod 97\) lan \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) punika \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Nanging saiki wis \( 0 < R_2 < 97 \) lan kanthi mangkono \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) lan mulane \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Iki ninggalake mung siji bisa ngganti digit saka \( P \) kanggo \( P^* \neq P \). Kene nanging \( N_k \) tetep ora owah, checksum digawe \( P \neq P^* \).
- Rong IBAN ing ngisor iki valid:
$$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Ing kene, kita njupuk kauntungan saka kasunyatan manawa kita wis nambah rong digit sing jejer ing \(A_1\) nganti \(97\) . Salajengipun, IBAN ora mung sah sacara formal, nanging kode bank sing ndasari 20730001 lan 20730098 pancen ana. - Kita nyoba dhisik, \( N_{k_1} \) lan \( N_{k_2} \) kanggo swap. Pisanan yaiku \( P = 98 - (A_B \mod 97) \) minangka \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) karo \(l = N_{k_2} - N_{k_1}\) lan \(1 \leq k_1, k_2 \leq 18\). Saiki amarga saka
$$\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}\). Mangkono uga \( P \neq P^* \). Dadi isih kudu dipriksa \(P_n\) lan \(N_k\) karo \( 1 \leq n \leq 2 \) lan \( 1 \leq k \leq 18 \) dagang. Bisa uga \(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)\). Awit kita \(A_B\) watara \(l \cdot 10^{24-k}\) kita kudu ngganti \(P_1\) utawa \(P_2\) watara \(-l\), dadi \(P\) watara \(-10^m l\) karo \(m \in \{0,1\}\) owah-owahan: Banjur iku \(P^* = 98 - R_2\) nanging uga \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), akibate \(R_2 = R_1 + 10^m l,\) lan kanthi mangkono
$$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Nanging, persamaan iki ora tau kawujud, kaya sing ditampilake ing skrip ing ngisor iki:See the Pen IBAN FORMULA CHECK by David Vielhuber (@vielhuber) on CodePen.
Iki godhong mung exchange bisa saka \(P_1\) lan \(P_2\). Kene nanging \( N_k \) tetep ora owah, checksum digawe \( P \neq P^* \). - Loro IBAN ing ngisor iki 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*}$$ Ing kene uga, BIC 20220800 pancen ana.