IBANの堅牢性について

よく知られているように、ドイツのIBANは、国コード(DE)、2桁の小切手桁( ISO 7064に準拠)、銀行コード(8桁)、および口座番号(サブ口座番号を含む、10)で構成されています。 -数字、欠落している数字は先行ゼロで埋められます)、したがって22桁です。 チェックディジットを計算するために、いわゆるBBAN(銀行コードと口座番号)、およびドイツの数値の国コード\(1314\)とチェックディジット\(00\) )が形成されます。


たとえば、銀行コード21050170と口座番号12345678は、国コードとチェックディジット00で展開されたBBAN 210501700012345678を返し、結果は\(x = 210501700012345678131400\)になります。ここで、チェックディジットは\(98 - (x \mod 97)\) 。 これが\(97\)で除算されるのは偶然ではありません。 可能な限り最大の2桁の素数として、転置された数字などの誤ったエントリを可能な限り高い確率で認識します。 次のステートメントを表示します:

  1. 有効なIBANの1桁を変更すると、無効なIBANになります。
  2. 有効なIBANの2桁を変更すると、有効なIBANになる可能性があります。
  3. 有効なIBANの2つの異なる位置が交換されると、無効なIBANが作成されます。
  4. 有効なIBANの2つの異なる位置を2回交換すると、有効なIBANが発生する可能性があります。

$$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。

次に、 $$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$$関連するBBAN(番号コード化された国コードDEとチェックディジット\(00\)で拡張)。

  1. 今すぐ変更 \(N_k\), は \(A_B^* = A_B + l \cdot 10^{24-k}\)\(1 \leq k \leq 18\)\((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). と \( P = 98 - (A_B \mod 97) \) しかし、 \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). 一般的に適用されます \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). と \(A_B \equiv R_1 \mod 97\)\(l \cdot 10^{24-k} \equiv R_2 \mod 97\)\( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). でも今は \( 0 < R_2 < 97 \) したがって \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) したがって \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). これにより、1桁の変更が1つだけ残ります。 \( P \)\( P^* \neq P \). ここだけど \( N_k \) 変更されないまま、チェックサムが作成されます \( P \neq P^* \).
  2. 次の2つのIBANが有効です。
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ここで活用できます、 \(A_1\)の隣接する2桁を\(97\)増やしました。 さらに、IBANは正式に有効であるだけでなく、基礎となる銀行コード20730001および20730098が実際に存在します。
  3. 最初に試してみます, \( N_{k_1} \)\( N_{k_2} \) 交換します。 最初は \( P = 98 - (A_B \mod 97) \) なので \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \)\(l = N_{k_2} - N_{k_1}\)\(1 \leq k_1, k_2 \leq 18\). 今は

    $$\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}\). そうです \( P \neq P^* \). ですから、それはまだチェックされていません \(P_n\)\(N_k\)\( 1 \leq n \leq 2 \)\( 1 \leq k \leq 18 \) 取引。 多分 \(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)\). 私たち以来 \(A_B\) その周り \(l \cdot 10^{24-k}\) 私たちは変えなければなりません \(P_1\) また \(P_2\) その周り \(-l\), それで \(P\) その周り \(-10^m l\)\(m \in \{0,1\}\) 変更:それでは \(P^* = 98 - R_2\) だけでなく、 \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), その結果 \(R_2 = R_1 + 10^m l,\) したがって
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ ただし、次のスクリプトが示すように、この方程式は決して満たされません。:

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

    これは可能な交換のみを残します \(P_1\)\(P_2\). ここだけど \( N_k \) 変更されないまま、チェックサムが作成されます \( P \neq P^* \).
  4. 次の2つのIBANが有効です。
    $$\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*}$$ここでも、BIC20220800が実際に存在します。
バック