Wozu Prüfsummen dienen

Eine Prüfsumme ist eine kurze, aus den Daten berechnete Zahl, die sich ändert, sobald sich auch nur ein Bit ändert. Der Empfänger berechnet sie erneut und vergleicht sie mit der übertragenen: Weichen sie ab, wurden die Daten unterwegs beschädigt. Die CRC-32 von „123456789“ ist CBF43926, der Prüfwert, mit dem man eine Implementierung testet.

Verschiedene Algorithmen gehören zu verschiedenen Einsatzgebieten. CRC-32 steckt in ZIP, PNG und Ethernet, CRC-32C in iSCSI, ext4 und Btrfs, CRC-16/MODBUS in Modbus-RTU-Industriegeräten, CRC-16/CCITT und XMODEM in seriellen Protokollen und Chipkarten, Adler-32 in der zlib-Kompression, schneller, aber schwächer bei kurzen Daten.

CRC-16-Varianten gibt es so viele, weil sich Polynom, Startwert, Bitspiegelung und abschließendes XOR unterscheiden: Deshalb liefert dieselbe Nachricht verschiedene Ergebnisse. Wenn du einen Wert prüfen willst und den Algorithmus nicht kennst, füge ihn ins Feld für den erwarteten Wert ein, und der Rechner sucht den passenden.

Häufige Fehler

  • Die Prüfsumme des Textes statt der Bytes berechnen: "0A" sind als Text zwei Zeichen, als Hex ein einziges Byte.
  • CRC-16-Varianten verwechseln: MODBUS, ARC und CCITT liefern bei denselben Daten verschiedene Ergebnisse.
  • Einen CRC zur Prüfung von Downloads aus unsicheren Quellen verwenden: Er ist leicht zu fälschen, nötig ist SHA-256.

Häufige Fragen

Warum wirkt die Modbus-CRC byteweise vertauscht?

Modbus überträgt die CRC mit dem niederwertigen Byte zuerst. Ist der berechnete Wert 4B37, stehen in der Nachricht die Bytes 37 4B.

Was unterscheidet CRC-32 von CRC-32C?

Sie verwenden verschiedene Polynome: das von Castagnoli (32C) erkennt manche Fehler besser und hat eigene Befehle in modernen Prozessoren, deshalb wird es bei Speichersystemen und schnellen Netzen bevorzugt.

Können zwei verschiedene Dateien dieselbe Prüfsumme haben?

Ja: 32 Bit ergeben rund 4 Milliarden Werte, zufällige Kollisionen kommen bei vielen Dateien vor, und gezielt eine zu erzeugen ist trivial.

So funktioniert diese Berechnung

CRC: Die Daten werden als Polynom über Bits aufgefasst und durch ein Generatorpolynom geteilt; der Rest ist die Prüfsumme. Jede Variante ist durch Breite, Polynom, Startwert, Spiegelung von Ein- und Ausgabe und abschließendes XOR festgelegt (etwa CRC-32: 32 Bit, 0x04C11DB7, Start 0xFFFFFFFF, gespiegelt, XOR 0xFFFFFFFF). Adler-32: A = 1 + Summe der Bytes, B = Summe der laufenden Werte von A, beide modulo 65521, Ergebnis B·65536 + A. Fletcher-16: ebenso modulo 255 und ohne die anfängliche 1.