IBAN'ın sağlamlığı hakkında

Alman IBAN'ı, ülke kodu (DE), iki basamaklı bir kontrol basamağı ( ISO 7064'e göre), banka kodu (8 basamak) ve hesap numarasından (alt hesap numarası dahil, 10 basamak, eksik basamaklar baştaki sıfırlarla doldurulur) oluşur ve toplamda 22 karakter uzunluğundadır. Kontrol basamağını hesaplamak için öncelikle BBAN (banka kodu ve hesap numarası), Almanya için sayısal ülke kodu \(1314\) ve kontrol basamağı \(00\) kullanılarak bir dizi oluşturulur.


Örneğin, banka kodu 21050170 ve hesap numarası 12345678, BBAN 210501700012345678'i verir. Bunu ülke kodu ve kontrol basamağı 00 ile genişlettiğimizde, \(x = 210501700012345678131400\) elde edilir; burada kontrol basamağı artık \(98 - (x \mod 97)\) olur. \(97\) ye bölme tesadüfi değildir. Mümkün olan en büyük iki basamaklı asal sayı olarak, yer değiştirmiş rakamlar gibi hataları mümkün olan en yüksek olasılıkla tespit eder. Şimdi aşağıdaki gözlemleri göstereceğiz.:

  1. Geçerli bir IBAN'ın bir rakamını değiştirmek geçersiz bir IBAN'a neden olur.
  2. Geçerli bir IBAN'ın iki farklı basamağını değiştirmek, geçerli bir IBAN ile sonuçlanabilir.
  3. Geçerli bir IBAN'ın iki farklı konumu değiştirilirse, geçersiz bir IBAN oluşturulur.
  4. Geçerli bir IBAN'ın iki farklı pozisyonunu iki kez değiştirirseniz, geçerli bir IBAN ortaya çıkabilir.

$$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}$$ geçerli bir IBAN.

Sonra $$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$$ ilişkili BBAN (sayı kodlu ülke kodu DE ve kontrol basamağı \(00\) ile genişletilir).

  1. Şimdi değiştir \(N_k\), dır-dir \(A_B^* = A_B + l \cdot 10^{24-k}\) ile birlikte \(1 \leq k \leq 18\) ve \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). İle birlikte \( P = 98 - (A_B \mod 97) \) ama \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Genel olarak geçerlidir \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). İle birlikte \(A_B \equiv R_1 \mod 97\) ve \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) dır-dir \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Ama şimdi öyle \( 0 < R_2 < 97 \) ve böylece \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) ve bu nedenle \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Bu, bir rakamın yalnızca bir olası değişikliğini bırakır. \( P \) ile \( P^* \neq P \). Burada ama \( N_k \) değişmeden kalır, sağlama toplamı oluşturulur \( P \neq P^* \).
  2. Aşağıdaki iki IBAN geçerlidir:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Burada, \(A_1\) deki iki bitişik rakamı \(97\) artırmış olmamızdan faydalanıyoruz. Ayrıca, IBAN sadece biçimsel olarak geçerli olmakla kalmıyor, aynı zamanda altta yatan banka kodları 20730001 ve 20730098 gerçekten mevcut.
  3. Ilk biz deneriz, \( N_{k_1} \) ve \( N_{k_2} \) takas etmek. ilk \( P = 98 - (A_B \mod 97) \) gibi \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) ile birlikte \(l = N_{k_2} - N_{k_1}\) ve \(1 \leq k_1, k_2 \leq 18\). Şimdi çünkü

    $$\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}\). Öyle \( P \neq P^* \). Bu yüzden kontrol edilmesi gereken kalır \(P_n\) ve \(N_k\) ile birlikte \( 1 \leq n \leq 2 \) ve \( 1 \leq k \leq 18 \) ticaret. Belki \(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)\). Bizden beri \(A_B\) etrafında \(l \cdot 10^{24-k}\) değişmek zorundayız \(P_1\) veya \(P_2\) etrafında \(-l\), böyle \(P\) etrafında \(-10^m l\) ile birlikte \(m \in \{0,1\}\) değişiklik: O zaman \(P^* = 98 - R_2\) Ayrıca \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), sonuç olarak \(R_2 = R_1 + 10^m l,\) ve böylece
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Ancak, aşağıdaki komut dosyasının gösterdiği gibi, bu denklem hiçbir zaman yerine getirilmez.:

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

    Bu, yalnızca olası bir alışverişi bırakır \(P_1\) ve \(P_2\). Burada ama \( N_k \) değişmeden kalır, sağlama toplamı oluşturulur \( P \neq P^* \).
  4. Aşağıdaki iki IBAN geçerlidir:
    $$\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*}$$ Burada da BIC 20220800 gerçekten var.
Geri