Sobre la robustez del IBAN

Como es bien sabido, el IBAN alemán consta del código de país (DE), un dígito de control de dos dígitos (según ISO 7064 ), el código bancario (8 dígitos) y el número de cuenta (incluido el número de subcuenta, 10 dígitos, los dígitos que faltan se rellenan con ceros a la izquierda) y, por lo tanto, son 22 dígitos. Para calcular el dígito de control, se forman el llamado BBAN (código bancario y número de cuenta), así como el código numérico de país \(1314\) para Alemania y el dígito de control \(00\) ).


Por ejemplo, el código de banco 21050170 y el número de cuenta 12345678 devuelven el BBAN 210501700012345678, ampliado con el código de país y el dígito de verificación 00, luego da como resultado \(x = 210501700012345678131400\) , donde el dígito de verificación ahora es: \(98 - (x \mod 97)\) . No es casualidad que esto se divida por \(97\) . Como el número primo de dos dígitos más grande posible, reconoce entradas incorrectas como dígitos transpuestos con la mayor probabilidad posible. Ahora mostramos las siguientes afirmaciones:

  1. Cambiar un dígito de un IBAN válido dará como resultado un IBAN no válido.
  2. Cambiar dos dígitos diferentes de un IBAN válido puede dar como resultado un IBAN válido.
  3. Si se intercambian dos posiciones diferentes de un IBAN válido, se crea un IBAN no válido.
  4. Si intercambia dos posiciones diferentes de un IBAN válido dos veces, puede resultar un IBAN válido.

Sea $$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}$$ un IBAN válido.

Entonces $$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$$ el BBAN asociado (ampliado con el código de país codificado con números DE y el dígito de verificación \(00\) ).

  1. Cambia ahora \(N_k\), es \(A_B^* = A_B + l \cdot 10^{24-k}\) con \(1 \leq k \leq 18\) y \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Con \( P = 98 - (A_B \mod 97) \) pero es \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Generalmente se aplica a \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Con \(A_B \equiv R_1 \mod 97\) y \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) es \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Pero ahora es \( 0 < R_2 < 97 \) y por lo tanto \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) y por lo tanto \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Esto deja sólo un cambio posible de un dígito de \( P \) para \( P^* \neq P \). Aquí pero \( N_k \) permanece sin cambios, se crea la suma de comprobación \( P \neq P^* \).
  2. Los siguientes dos IBAN son válidos:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ Aquí es donde se aprovecha , que aumentamos dos dígitos adyacentes en \(A_1\) por \(97\) . Además, el IBAN no solo es formalmente válido, sino que los códigos bancarios subyacentes 20730001 y 20730098 realmente existen.
  3. Intentamos primero, \( N_{k_1} \) y \( N_{k_2} \) para intercambiar. Primero es \( P = 98 - (A_B \mod 97) \) como \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) con \(l = N_{k_2} - N_{k_1}\) y \(1 \leq k_1, k_2 \leq 18\). Ahora es por

    $$\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}\). Asi es \( P \neq P^* \). Por lo que queda por comprobar que \(P_n\) y \(N_k\) con \( 1 \leq n \leq 2 \) y \( 1 \leq k \leq 18 \) vientos alisios. Tal vez \(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)\). Desde que nosotros \(A_B\) alrededor \(l \cdot 10^{24-k}\) tenemos que cambiar \(P_1\) o \(P_2\) alrededor \(-l\), asi que \(P\) alrededor \(-10^m l\) con \(m \in \{0,1\}\) cambio: Entonces es \(P^* = 98 - R_2\) pero también \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), como consecuencia \(R_2 = R_1 + 10^m l,\) y por lo tanto
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Sin embargo, esta ecuación nunca se cumple, como muestra el siguiente script:

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

    Esto deja sólo un posible intercambio de \(P_1\) y \(P_2\). Aquí pero \( N_k \) permanece sin cambios, se crea la suma de comprobación \( P \neq P^* \).
  4. Los siguientes dos IBAN son válidos:
    $$\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*}$$ Aquí también existe el BIC 20220800.
Atrás