# ISO/IEC 7064

ISO/IEC 7064 (Informationstechnik – IT-Sicherheitsverfahren – Prüfzeichensysteme, englisch Information technology – Security techniques – Check character systems) ist ein ISO- und IEC-Standard, der Prüfzeichensysteme zur Fehlererkennung normiert.
Ziel der Norm ist es, eine Auswahl standardisierter Prüfzeichensysteme vorzulegen, die bestimmte, mathematisch gesicherte Eigenschaften aufweisen. Sie sollen vor allem bestimmte Eingabefehler in Zeichenketten erkennen, wie sie typischerweise bei der Dateneingabe durch Menschen auftreten. Individuell entwickelte Prüfzeichenalgorithmen, die auf ähnlichen Verfahren beruhen ohne signifikanten Mehrwert zu bieten, sondern vielmehr oft fehlerbehaftet sind, sollen so vermieden werden können. Die standardisierten Verfahren nach ISO 7064 sollen somit eine höhere Sicherheit bieten, die Implementierung in Programmbibliotheken und den Datenaustausch zwischen Kommunikationspartnern erleichtern.

## Entwicklung

Der Standard wurde im Joint Technical Committee ISO/IEC JTC 1 (Information technology) vom Unterkomitee SC 27 (IT Security techniques) entwickelt. Die, Stand 2020, gültige Fassung ISO/IEC 7064:2003 ersetzte die Fassung ISO 7064:1983. Die neue Fassung enthält technische Revisionen; Programme, die konform mit der alten Fassung sind, sind dies auch mit der neuen.
Vor Ausgabe der ISO 7064 waren Prüfzeichensysteme für spezielle Anwendungen schon in verschiedenen anderen ISO-Normen enthalten: ISO 2108 definiert ein Prüfziffersystem für Internationale Standardbuchnummern (ISBN), ISO 2894 (inzwischen zurückgezogen) für geprägte Kreditkartennummern und ISO 6166 für internationale Wertpapierkennnummern (ISIN).

## Normierte Systeme

Die Verfahren sind für Quell-Zeichenketten definiert, deren Zeichenvorrat aus alphanumerischen Zeichen des lateinischen Alphabets oder Teilmengen hiervon – nur Buchstaben oder nur Ziffern – besteht. Andere Zeichen werden ignoriert.
Ein Prüfzeichen (check character) ist ein Zeichen, das aus der Quell-Zeichenkette gebildet und ihr hinzugefügt wird. Ein Sonderprüfzeichen (suplementary check character) ist ein Prüfzeichen, das nicht zum Zeichenvorrat gehört, aus dem die Quell-Zeichenketten bestehen können. Prüfzeichensysteme legen fest, wie die Prüfzeichen gebildet werden und wie die Prüfung erfolgt.
Alle Systeme setzen bei der Prüfzeichenberechnung mindestens eine Modulo-Operation (MOD) ein. Reine Systeme verwenden nur einen Divisor, hybride Systeme zwei verschiedene Divisoren. Hybride Systeme kommen mit einem Prüfzeichen aus, das kein Sonderprüfzeichen ist. Reine Systeme müssen entweder auf zwei Prüfzeichen oder ein Sonderprüfzeichen zurückgreifen.
Für reine Systeme gibt der Standard neben einer Art rekursiven Berechnungsvorschrift noch Gewichtstabellen für eine Berechnung als gewichtete Quersumme an.
Prüfzeichensysteme nach ISO/IEC 7064 :
| Bezeichnung | Zeichenvorrat der Quell-Zeichenkette | rein/hybrid | Prüfzeichen |
| ISO/IEC 7064, MOD 11-2 | numerisch | rein | eine Ziffer oder 'X' |
| ISO/IEC 7064, MOD 37-2 | alphanumerisch | rein | ein alphanumerisches Zeichen oder '*' |
| ISO/IEC 7064, MOD 97-10 | numerisch | rein | zwei Ziffern |
| ISO/IEC 7064, MOD 661-26 | alphabetisch | rein | zwei Buchstaben |
| ISO/IEC 7064, MOD 1271-36 | alphanumerisch | rein | zwei alphanumerische Zeichen |
| ISO/IEC 7064, MOD 11,10 | numerisch | hybrid | eine Ziffer |
| ISO/IEC 7064, MOD 27,26 | alphabetisch | hybrid | ein Buchstabe |
| ISO/IEC 7064, MOD 37,36 | alphanumerisch | hybrid | ein alphanumerisches Zeichen |
In einem Anhang zeigt der Standard, wie für andere Alphabete als das lateinische entsprechende Systeme entwickelt werden können.

### Zuweisung von Zeichenwerten

Grundsätzlich müssen den einzelnen Zeichen der Quell-Zeichenkette zunächst Zahlenwerte zugeordnet werden. Dazu iterieren die Algorithmen aller Prüfsysteme durch die einzelnen Zeichen einer Zeichenkette der Reihe nach und ordnen jedem Zeichen eineindeutig einen Zahlenwert zu, mit dem dann weitergerechnet wird. Jede Ziffer erhält unmittelbar ihren Ziffernwert. Buchstaben erhalten fortlaufend Zahlwerte gemäß ihrer Position im Alphabet: Bei alphabetischem Zeichenvorrat erhält A den Wert 0, B den Wert 1 usw. bis Z den Wert 25 erhält. Bei alphanumerischem Zeichenvorrat wird 10 hinzuaddiert: Man weist A den Wert 10 zu, B den Wert 11 usw. bis Z den Wert 35 erhält.
Nach der Berechnung hat man im Ergebnis, je nach System, ein oder zwei Prüfzeichenwerte. Diese Prüfzeichenwerte werden wieder in korrespondierende Prüfzeichen umgewandelt. Werte, für die es kein Zeichen im Zeichenvorrat gibt, werden auf ein Sonderprüfzeichen abgebildet. Die Prüfzeichen werden in der Regel der Quell-Zeichenkette hinzugefügt.

### Algorithmus für reine Systeme mit einem Prüfzeichen

ISO/IEC 7064, MOD 11-2 berechnet einen Prüfzeichenwert für eine Zeichenkette aus n Ziffern wie folgt:
Die Verwendung des Modulo innerhalb der Schleife ist nicht unbedingt erforderlich, verhindert aber bei langen Zeichenketten und großem R, dass sehr große Produkte entstehen.
Beispiel: Die Zeichenkette "0794" erhält das Prüfzeichen '0'.
* i = 1:
** Summe := 0 + 0 = 0
** Produkt := (0 * 2) MOD 11 = 0
* i = 2:
** Summe := 7 + 0 = 7
** Produkt := (7 * 2) MOD 11 = 3
* i = 3:
** Summe := 9 + 3 = 12
** Produkt := (12 * 2) MOD 11 = 2
* i = 4:
** Summe := 4 + 2 = 6
** Produkt := (6 * 2) MOD 11 = 1
* Prüfzeichenwert := (11 + 1 - 1) MOD 11 = 0
Der Prüfzeichenwert liegt zwischen 0 und 10. Für 0 bis 9 ist das Prüfzeichen unmittelbar die entsprechende Ziffer, für 10 ist es 'X'. Die Zeichenkette "079" würde dieses Prüfzeichen 'X' erhalten, weil (11 + 1 - 2) MOD 11 = 10.
Die Berechnung von ISO/IEC 7064, MOD 37-2 erfolgt analog, nur mit M : 37 und mit anderem Zeichenvorrat und damit anderen Zeichenwerten. Ist der Prüfzeichenwert 36, wird hier das Sonderprüfzeichen '*' gesetzt.

### Algorithmus für reine Systeme mit zwei Prüfzeichen

Für die Systeme mit zwei Prüfzeichen erfolgt die Berechnung wie in Systemen mit einem Prüfzeichen. Dabei haben M bzw. R für 97-10 die Werte 97 bzw. 10, für 661-26 die Werte 661 bzw. 26 und für 1271-36 die Werte 1271 bzw. 36. Der letzte Schritt ist zu ersetzen durch:

### Algorithmus für hybride Systeme

ISO/IEC 7064, MOD 11,10 berechnet eine Prüfziffer für eine Zeichenkette aus n Ziffern wie folgt:
In Worten: Man berechnet fortlaufend ein Zwischenergebnis („Produkt“), das Werte zwischen 1 und 10 (einschließlich) annehmen kann. Es wird mit einem Zwischenergebnis von 10 begonnen. Nacheinander wird mit jedem der Zeichen wie folgt verfahren:
* Der Zahlenwert des Zeichens (die Ziffer) wird auf das Zwischenergebnis addiert. Man erhält eine Zahl zwischen 1 und 19 (einschließlich).
* Davon wird die letzte Ziffer Z genommen. Für die Ziffer 0 wird Z der Wert 10 zugewiesen. Man hat jetzt also eine Zahl Z („Summe“) zwischen 1 und 10 (1 ≤ Z ≤ 10).
* Zahlen 1 ≤ Z ≤ 5 werden nun auf die geraden Zahlen zwischen 2 und 10 abgebildet (und zwar auf das Doppelte von Z), Zahlen 5 < Z ≤ 10 werden auf die ungeraden Zahlen zwischen 1 und 9 abgebildet (auf den Rest der Division des Doppelten durch 11). Das ist das neue Zwischenergebnis, das wieder ein Wert zwischen 1 und 10 ist.
Wenn auf diese Weise alle Zeichen in das Zwischenergebnis eingeflossen sind, ist sein 11-Komplement (11 – Zwischenergebnis) die Prüfziffer, wobei für den Wert 10 die Prüfziffer 0 genommen wird.
Beispiel: Die Zeichenkette "0794" erhält die Prüfziffer '5'.
* i = 1:
** Summe := (0 + 10) MOD 10 = 0
** Summe = 0, also Summe := 10
** Produkt := (10 * 2) MOD 11 = 9
* i = 2:
** Summe := (7 + 9) MOD 10 = 6
** Produkt := (6 * 2) MOD 11 = 1
* i = 3:
** Summe := (9 + 1) MOD 10 = 0
** Summe = 0, also Summe := 10
** Produkt := (10 * 2) MOD 11 = 9
* i = 4:
** Summe := (4 + 9) MOD 10 = 3
** Produkt := (3 * 2) MOD 11 = 6
* Prüfzeichenwert := 11 - 6 = 5
ISO/IEC 7064, MOD 27,26 für Buchstaben und ISO/IEC 7064, MOD 37,36 für Ziffern und Buchstaben lassen sich als Varianten von MOD 10,11 verstehen. Ihnen liegt lediglich ein anderer Zeichenvorrat zugrunde bzw. sie beruhen statt auf dem Dezimalsystem auf einem System zur Basis 26 oder 36. Auf ähnliche Weise lassen sich weitere Varianten für andere Zeichenvorräte schaffen.

## Eigenschaften

erkannte Fehler, in % :
| MOD | S$_2$ | T$_0$ | T$_1$ | F |
| 11-2 | 90,0 | 100,0 | 100,0 | 90,9 |
| 37-2 | 97,3 | 100,0 | 100,0 | 99,0 |
| 97-10 | 99,0 | 100,0 | 100,0 | 99,0 |
| 661-26 | 99,9 | 100,0 | 100,0 | 99,9$^1$ |
| 1271-36 | 100,0$^1$ | 100,0 | 100,0 | 99,9$^1$ |
| 11,10 | 89,0 | 97,8 | 90,7 | 90,0 |
| 27,26 | 96,0 | 99,7$^1$ | 97,6 | 96,2 |
| 37,36 | 97,2 | 99,8 | 98,3 | 97,2 |
| $^{1)}$auf eine Nachkommastelle gerundet |||||
Alle Systeme des Standards erkennen folgende Kategorien von Fehlern (die Beispiele illustrieren Fehler in der Zeichenkette "STANDARD", fehlerhafte Zeichen sind fett markiert)
* alle Fehler, die durch den Austausch eines einzelnen Zeichens entstehen (einfacher Substitutionsfehler, Beispiel: "SZANDARD"),
* alle Fehler durch (zirkuläres) Verschieben der Zeichen (Beispiel: "ANDARDST"), sofern die Zeichenkette um weniger als zehn Zeichen verschoben ist.
In folgenden Fällen erkennen einige Systeme nur einen Teil der Fehler, der Standard gibt typische Fehlererkennungsquoten an:
* fast alle Fehler, die durch den Austausch zweier Zeichen entstehen (Substitutionsfehler S$_2$, Beispiel: "SZANFARD")
* fast alle Fehler, die in dem Vertauschen zweier Zeichen mit höchstens einem Zeichen Abstand bestehen (Transpositionsfehler ohne Abstand T$_0$ und mit einem Zeichen Abstand T$_1$, Beispiele: "STANDADR", "STANDDRA"),
* einen großen Anteil aller anderen Fehler (F).

## Auswahl eines Systems

In den Anhängen schlägt der Standard Auswahlkriterien für Prüfzeichensysteme vor. Neben Zeichenvorrat und der Anzahl zusätzlich erforderlicher Zeichen spielen die Quoten erkannter Fehler eine wichtige Rolle. Dabei muss berücksichtigt werden, welche Fehlertypen im jeweiligen Anwendungsfall besonders häufig sind. So liegt der Anteil der einfachen Substitutionsfehler an der Gesamtzahl der Fehler typischerweise bei 60 bis 85 %, aber auch deutliche Abweichungen hiervon sind möglich, zweifache Substitutionsfehler machen in typischen Anwendungsfällen 5 bis 15 % aller Fehler aus.

## Anwendungen

Dem Test von Prüfzeichen werden typischerweise weitere Prüfungen vorausgeschickt, etwa der in den Zeichenketten enthaltenen Zeichen oder der Zeichenkettenlänge.
International Standard Name Identifier (ISNI) und ORCID setzen das MOD 11-2 Verfahren ein.
Die International Society of Blood Transfusion verwendet für ISBT 128 Spendennummern, die auch Buchstaben enthalten können, MOD 37-2.
Zweistellige Prüfsummen nach MOD 97-10 werden unter anderem in Internationalen Bankkontonummern (IBAN), bei der Leitweg-ID und Legal Entity Identifiern (LEI) für Rechtsträger im Finanzmarkt verwendet.
Das medizinische Etikettierungssystem nach Eurocode IBLS empfiehlt die Verwendung von ISO/IEC 7064, MOD 11,10 zur Fehlererkennung. In Deutschland werden dementsprechend Präparatennummern des Blutspendedienstes mit einer MOD 11,10-Prüfziffer versehen. MOD 11,10 ist auch Grundlage der Prüfzifferberechnung der deutschen Umsatzsteuernummer und der persönlichen Steuer-ID.
Die Verfahren sind weder für die automatische Fehlerkorrektur noch zur Abwehr gezielter Fälschungen von Zeichenketten geeignet (siehe hierzu Kryptographische Hashfunktion).