关于 IBAN 的稳健性

德国 IBAN 由国家代码 (DE)、两位校验位(符合ISO 7064 标准)、银行代码(8 位数字)和账号(包括子账号,共 10 位数字,缺失的数字用前导零补全)组成,总长度为 22 个字符。为了计算校验位,首先根据所谓的 BBAN(银行代码和账号)、德国的数字国家代码\(1314\)和校验位\(00\)生成一个序列。


例如,银行代码 21050170 和账号 12345678 计算出的 BBAN 为 210501700012345678。加上国家代码和校验位 00,得到\(x = 210501700012345678131400\) ,其中校验位为: \(98 - (x \mod 97)\) 。除以\(97\)并非偶然。作为最大的两位素数,它能以最高的概率检测出诸如数字颠倒之类的错误。接下来,我们将展示以下观察结果。:

  1. 更改有效 IBAN 的一位数字将导致 IBAN 无效。
  2. 更改有效 IBAN 的两个不同数字可能会产生有效的 IBAN。
  3. 如果有效 IBAN 的两个不同位置互换,则会创建无效 IBAN。
  4. 如果您将有效 IBAN 的两个不同位置交换两次,则可能会产生有效的 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$$ 131400 $$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^* \). 这仅留下一个可能的数字变化 \( P \)\( P^* \neq P \). 这里不过 \( N_k \) 保持不变,校验和被创建 \( P \neq P^* \).
  2. 以下两个IBAN账号有效:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$这里,我们利用了\(A_1\)中相邻两位数字相加\(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. 以下两个 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*}$$这里也确实存在 BIC 20220800。
背部