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:
- La modifica di una cifra di un IBAN valido risulterà in un IBAN non valido.
- La modifica di due cifre diverse di un IBAN valido può risultare in un IBAN valido.
- Se si scambiano due diverse posizioni di un IBAN valido, viene creato un IBAN non valido.
- 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\) ).
- 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^* \).
- 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. - 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^* \). - 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.