Sulla robustezza dell'IBAN

Come è noto, l'IBAN tedesco è composto dal prefisso internazionale (DE), da una cifra di controllo a due cifre (secondo ISO 7064 ), dal codice bancario (8 cifre) e dal numero di conto (incl. numero di conto secondario, 10 cifre, le cifre mancanti vengono riempite con zeri iniziali) ed è quindi di 22 cifre. Per calcolare la cifra di controllo, vengono formati il ​​cosiddetto BBAN (codice bancario e numero di conto) nonché il prefisso numerico del paese \(1314\) per la Germania e la cifra di controllo \(00\) ).


Ad esempio, il codice bancario 21050170 e il numero di conto 12345678 restituiscono il BBAN 210501700012345678, ampliato con il prefisso internazionale e la cifra di controllo 00, quindi risulta \(x = 210501700012345678131400\) , dove la cifra di controllo è ora: \(98 - (x \mod 97)\) . Non è un caso che questo sia diviso per \(97\) . Come numero primo a due cifre più grande possibile, riconosce le voci errate come le cifre trasposte con la massima probabilità possibile. Mostriamo ora le seguenti affermazioni:

  1. La modifica di una cifra di un IBAN valido risulterà in un IBAN non valido.
  2. La modifica di due cifre diverse di un IBAN valido può risultare in un IBAN valido.
  3. Se si scambiano due diverse posizioni di un IBAN valido, viene creato un IBAN non valido.
  4. Se si scambiano due diverse posizioni di un IBAN valido due volte, può risultare un IBAN valido.

Sia $$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 valido.

Allora $$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$$ il BBAN associato (esteso con il prefisso numerico del paese DE e la cifra di controllo \(00\) ).

  1. Cambia ora \(N_k\), è \(A_B^* = A_B + l \cdot 10^{24-k}\) insieme a \(1 \leq k \leq 18\) e \((-1) \cdot N_k \leq l \leq 9-N_k \wedge l \neq 0\). Insieme a \( P = 98 - (A_B \mod 97) \) ma è \(P^* = 98 - \left((A_B + l \cdot 10^{24-k}) \mod 97\right) \). Generalmente si applica a \( a \equiv a' \mod m, b \equiv b' \mod m \): \(a + b \equiv a' + b' \mod m\). Insieme a \(A_B \equiv R_1 \mod 97\) e \(l \cdot 10^{24-k} \equiv R_2 \mod 97\) è \( (A_B + l \cdot 10^{24-k}) \equiv R_1 + R_2 \mod 97 \). Ma ora lo è \( 0 < R_2 < 97 \) e quindi \( P^* = 98 - (R_1+R_2) \neq 98 - R_1 = P \) e quindi \( P_1 \neq P_1^* \vee P_2 \neq P_2^* \). Ciò lascia solo una possibile modifica di una cifra da \( P \) a \( P^* \neq P \). Qui ma \( N_k \) rimane invariato, viene creato il checksum \( P \neq P^* \).
  2. Sono validi i seguenti due IBAN:
    $$\begin{align} A_1 = DE89207300\boldsymbol{\color{red}01}0012345674 \\ A_2 = DE89207300\boldsymbol{\color{red}98}0012345674 \end{align}$$ È qui che ne approfitti , che abbiamo aumentato due cifre adiacenti in \(A_1\) di \(97\) . Inoltre, l'IBAN non è solo formalmente valido, ma esistono effettivamente i codici bancari sottostanti 20730001 e 20730098.
  3. Proviamo prima, \( N_{k_1} \) e \( N_{k_2} \) scambiare. Il primo è \( P = 98 - (A_B \mod 97) \) come \(P^* = 98 - \left((A_B + l \cdot 10^{24-k_1} - l \cdot 10^{24-k_2}) \mod 97\right) \) insieme a \(l = N_{k_2} - N_{k_1}\) e \(1 \leq k_1, k_2 \leq 18\). Ora è a causa di

    $$\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}\). Così è \( P \neq P^* \). Quindi resta da verificare \(P_n\) e \(N_k\) insieme a \( 1 \leq n \leq 2 \) e \( 1 \leq k \leq 18 \) commerci. Forse \(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)\). Da quando noi \(A_B\) intorno a \(l \cdot 10^{24-k}\) dobbiamo cambiare \(P_1\) o \(P_2\) intorno a \(-l\), Così \(P\) intorno a \(-10^m l\) insieme a \(m \in \{0,1\}\) cambia: allora è \(P^* = 98 - R_2\) ma anche \(P^* = P - 10^m l = 98 - R_1 - 10^m l\), di conseguenza \(R_2 = R_1 + 10^m l,\) e quindi
    $$((A_B \mod 97) + (l \cdot 10^{24-k} \mod 97)) \mod 97 = (A_B \mod 97) + 10^m l$$ Tuttavia, questa equazione non viene mai soddisfatta, come mostra il seguente script:

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

    Questo lascia solo un possibile scambio di \(P_1\) e \(P_2\). Qui ma \( N_k \) rimane invariato, viene creato il checksum \( P \neq P^* \).
  4. Sono validi i seguenti due 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*}$$ Anche qui il BIC 20220800 esiste effettivamente.
Indietro