يتكون رقم الحساب المصرفي الدولي الألماني (IBAN) من رمز الدولة (DE)، ورقم تحقق مكون من خانتين (وفقًا لمعيار ISO 7064 )، ورمز البنك (8 خانات)، ورقم الحساب (بما في ذلك رقم الحساب الفرعي، 10 خانات، مع إضافة أصفار بادئة للأرقام المفقودة)، ليصبح طوله 22 خانة. لحساب رقم التحقق، يتم أولًا تكوين تسلسل من ما يُسمى برقم الحساب المصرفي الدولي الألماني (BBAN) (رمز البنك ورقم الحساب)، ورمز الدولة الرقمي لألمانيا \(1314\) ، ورقم التحقق \(00\) .
على سبيل المثال، ينتج عن رمز البنك 21050170 ورقم الحساب 12345678 رمز BBAN 210501700012345678. بإضافة رمز الدولة ورقم التحقق 00، نحصل على: \(x = 210501700012345678131400\) ، حيث أصبح رقم التحقق: \(98 - (x \mod 97)\) . القسمة على \(97\) ليست عشوائية، فهي أكبر عدد أولي مكون من رقمين، ما يجعلها تكشف الأخطاء، مثل تبديل الأرقام، بأعلى احتمال ممكن. سنعرض الآن الملاحظات التالية.:
- سيؤدي تغيير رقم واحد من رقم IBAN صالح إلى رقم IBAN غير صالح.
- يمكن أن يؤدي تغيير رقمين مختلفين من رقم IBAN صالح إلى رقم IBAN صالح.
- إذا تم تبديل موضعين مختلفين لرقم IBAN صالح ، فسيتم إنشاء رقم IBAN غير صالح.
- إذا قمت بتبديل مركزين مختلفين لرقم 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$$ BBAN المرتبط (ممتد برمز البلد المرمز بالرقم DE ورقم التحقق \(00\) ).
- تغيير الآن \(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^* \).
- رقما الحساب المصرفي الدولي (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 موجودة بالفعل. - نحاول أولا, \( 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^* \). - رقمان 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 موجود بالفعل.