>


       Money












DE11 6406 1854 0066 6710 00


  1. DE00 6406 1854 0066 6710 00
  2. 6406 1854 0066 6710 00 DE00
  3. 6406 1854 0066 6710 00 1314 00
  4. 640618540066671000131400 MOD 97 = 11

IBAN
Jetzt schreiben wir ein Programm, zur Berechnung des MOD bei so großen Zahlen.
Problem: Wir haben eine Grosse Zahl, die nicht in das QUAD-WORD-Schema von 2^64 passt.

Die Rechenregeln für den Modulo lauten:


(a ADD b) MOD c = ((a MOD c) ADD (b MOD c)) MOD c
(a SUB b) MOD c = ((a MOD c) SUB (b MOD c)) MOD c
(a MUL b) MOD c = ((a MOD c) MUL (b MOD c)) MOD c



Außserdem gilt:


(1234 5678 1000) MOD c

= ((((1234 MOD c) MUL (1 0000 0000 MOD c)) MOD c) MUL
(((5678 MOD c) MUL (1 0000 MOD c)) MOD c) MUL
(1234 MOD c)) MOD c



Jetzt müssen wir zwei Mögliche Fehler ausmärzen:
  1. Einen Bug habe ich gefunden. Das muss in diesem Falle nicht *1000 heißen.
    Warum?
    Schauen wir uns mal eine IBAN an.
    Da steht
    Am Ende, die letzten zwei:
    3124 1213
    Gut. Aber!
    3124 0000
    Das sind nicht 3124 * 1000
    sondern 3124 * 10000
  2. Jetzt gibt es ein Problem meine Damen und Herren, ab einem Punkt, spukt mein C-Programm scheinbar einen Fehler aus. Man schaue sich mal an:


    int x[] = {6406, 1854, 66, 6710, 13, 1400}; /* Richtig */
    int x[] = {6406, 1854, 0066, 6710, 0013, 1400}; /* Falsch */



    Richtig! C kommt nicht mit führenden Nullen vorne aus!
Jetzt die C-Quelltexte, erst, der mit einer Ausführung quasi als hingeschriebenen Terminals


#include <stdio.h>

int main(void) {

   //int x[] = {2105, 170, 12, 3456, 7813, 1400};
   //int x[] = {2105, 0170, 0012, 3456, 7813, 1400};
   int x[] = {6406, 1854, 66, 6710, 13, 1400};
   int y;

   x[5] = x[5] % 97;
   x[4] = ((x[4] % 97) * (10000 % 97)) % 97;
   x[3] = ((x[3] % 97) * (10000 % 97) * (10000 % 97)) % 97;
   x[2] = ((x[2] % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97)) % 97;
   x[1] = ((x[1] % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97)) % 97;
   x[0] = ((x[0] % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97)) % 97;

   y = (x[5] + x[4]) % 97;
   y = (y + x[3]) % 97;
   y = (y + x[2]) % 97;
   y = (y + x[1]) % 97;
   y = (y + x[0]) % 97;
   y = y % 97;

   printf("%i\n", 98 - y);

return 0;
}



iban.c


Und jetzt der C-Quelltext, als Algorithmus:


#include <stdio.h>

int main(void) {
   int x[] = {6406, 1854, 66, 6710, 13, 1400};
   //int x[] = {2105, 170, 12, 3456, 7813, 1400};
   int i, j;
   int y, z;
   int sum;

   for(i = 5, z = 1; i >= 0; i--) {
      x[i] = x[i] % 97;
      z = z % 97;
      x[i] = x[i] * z;
      x[i] = x[i] % 97;
      z = (z * (10000 % 97)) % 97;
   }

   for(i = 5, y = 0; i >= 0; i--) {
      y = (y + (x[i] % 97));
      y = y % 97;
   }
   y = y % 97;

   sum = 98 - y;

   printf("%i\n", sum);

return 0;
}



iban2.c



   <form>
      <fieldset>
         <legend>IBAN</legend>
         <label for="iban1"> </label>
         <input type="text" id="iban1" size="4"/>
         <input type="text" id="iban2" size="4"/>
         <input type="text" id="iban3" size="4"/>
         <input type="text" id="iban4" size="4"/>
         <input type="text" id="iban5" size="4"/>
         <input type="text" id="iban6" size="2"/>
         <button onclick="ibanfunc()">Check</button>
      </fieldset>
   </form>

<script>
   function ibanfunc() {

   var ibantext1 = document.getElementById('iban1').value;
   var ibantext2 = document.getElementById('iban2').value;
   var ibantext3 = document.getElementById('iban3').value;
   var ibantext4 = document.getElementById('iban4').value;
   var ibantext5 = document.getElementById('iban5').value;
   var ibantext6 = document.getElementById('iban6').value + "13";
   var ibantext7 = "1400";
   if(ibantext1.length != 4)
      alertwronginput();
   else if((ibantext1.charAt(0) != 'D') && (ibantext1.charAt(0) != 'd'))
      alertwronginput();
   else if((ibantext1.charAt(1) != 'E') && (ibantext1.charAt(1) != 'e'))
      alertwronginput();
   else if(ibantext2.length != 4)
      alertwronginput();
   else if(ibantext3.length != 4)
      alertwronginput();
   else if(ibantext4.length != 4)
      alertwronginput();
   else if(ibantext5.length != 4)
      alertwronginput();
   else if(ibantext6.length != 4)
      alertwronginput();
   else {
      alert(ibantext7);
   var x1 = parseInt(ibantext2, 10);
   var x2 = parseInt(ibantext3, 10);
   var x3 = parseInt(ibantext4, 10);
   var x4 = parseInt(ibantext5, 10);
   var x5 = parseInt(ibantext6, 10);
   var x6 = parseInt(ibantext7, 10);

   x6 = x6 % 97;
   x5 = ((x5 % 97) * (10000 % 97)) % 97;
   x4 = ((x4 % 97) * (10000 % 97) * (10000 % 97)) % 97;
   x3 = ((x3 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97)) % 97;
   x2 = ((x2 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97)) % 97;
   x1 = ((x1 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97) * (10000 % 97)) % 97;

   var y = (x6 + x5) % 97;
   y = (y + x4) % 97;
   y = (y + x3) % 97;
   y = (y + x2) % 97;
   y = (y + x1) % 97;
   y = y % 97;
   y = 98 - y;

   alert(y.toString());

   }
   function alertwronginput() {
      alert("This is not a german IBAN!");
   }
}
</script>



Ist die Prüfsumme richtig eingegeben, oder die IBAN richtig, das prüfen wir in folgendem Program:
IBAN




David Vajda
Schickhardtstraße 5
D-72072, Tübingen
+491735807467
david@ituenix.de
http://www.ituenix.de