Was ein CRC ist
Eine zyklische Redundanzprüfung behandelt die Nachricht als eine lange Binärzahl und teilt sie durch ein festes Polynom; der Rest ist die Prüfsumme. Kippt ein einzelnes Bit oder ein Bitbündel, das kürzer als der CRC ist, ändert sich der Rest, weshalb CRCs Ethernet-Frames, ZIP-Einträge, PNG-Chunks, Plattensektoren und serielle Protokolle schützen. Sie sind in Hardware und Software schnell, aber nicht kryptografisch: Jeder kann Daten mit einem gewünschten CRC erzeugen.
Warum es so viele „CRC-16“ gibt
Zwei Implementierungen derselben Breite können sich in fünf Parametern unterscheiden, und jede Kombination ist eine andere Prüfsumme:
| Parameter | Bedeutung |
|---|---|
| Polynom | Der Divisor, ohne sein oberstes Bit geschrieben (0x1021 für CCITT, 0x04C11DB7 für CRC-32). |
| Init | Der Startwert des Registers, 0 oder lauter Einsen. |
| Eingabe spiegeln | Ob jedes Eingabebyte mit dem niedrigstwertigen Bit zuerst verarbeitet wird (ja bei CRC-32, MODBUS; nein bei CCITT-FALSE, XMODEM). |
| Ausgabe spiegeln | Ob das Endregister bitweise umgekehrt wird. |
| XOR out | Ein abschließendes XOR, meist 0 oder lauter Einsen. |
Die Standardmethode, eine Variante zu identifizieren, ist ihr Prüfwert: der CRC der ASCII-Zeichenkette 123456789. Die Tabelle oben zeigt ihn für jedes Modell, und die Standardeingabe ist genau diese Zeichenkette; wenn ein Gerät Ihnen eine Prüfsumme für bekannte Daten liefert, können Sie sie gegen alle Varianten auf einmal abgleichen.
Gängige Varianten
- CRC-32 (0x04C11DB7, gespiegelt): Ethernet, ZIP, gzip, PNG,
zlib.crc32,cksum -o 3. - CRC-32C (Castagnoli): iSCSI, SCTP, ext4-Metadaten, Btrfs, LevelDB; hat eine Hardware-Instruktion auf x86 und ARM und ist daher die schnelle Wahl für neue Entwürfe.
- CRC-16/MODBUS: Modbus RTU über seriell; CRC-16/CCITT-FALSE: Bluetooth, viele „CRC-CCITT“-Angaben; CRC-16/XMODEM: XMODEM, Python
binascii.crc_hqx. - Adler-32: zlib-Streams; schneller als CRC, aber schwächer bei kurzen Eingaben.
Fragen
Ist ein CRC dasselbe wie ein Hash?
Nein. Ein CRC erkennt zufällige Beschädigungen und lässt sich trivial umkehren oder fälschen. Für Integrität gegen einen Angreifer oder zum Identifizieren von Dateien nehmen Sie SHA-256. Für Geschwindigkeit auf einem vertrauenswürdigen Kanal ist CRC in Ordnung.
Mein Gerät liefert einen anderen CRC-16 als diese Seite.
Es gibt mindestens ein Dutzend CRC-16-Varianten. Geben Sie die Daten ein, die das Gerät geprüft hat, und vergleichen Sie seinen Wert mit jeder Zeile der Tabelle; die passende Zeile verrät Polynom, Init und Spiegelung des Geräts. Passt keine, probieren Sie das eigene Modell und prüfen Sie, ob das Gerät ein Längenbyte oder eine Adresse in die Daten einbezieht.
Welche Bytereihenfolge hat das Ergebnis?
Der CRC wird als Zahl angezeigt. Wenn er in ein Paket geschrieben wird, bestimmt das Protokoll die Reihenfolge: MODBUS sendet das niedrige Byte zuerst, XMODEM das hohe. Sehen Sie in der Spezifikation oder in einem Beispiel-Frame nach.
Was ist CRC-32C und warum verwenden Datenbanken es?
CRC-32 mit dem Castagnoli-Polynom, das bei den Blockgrößen von Speichersystemen bessere Fehlererkennung bietet und als einzelne CPU-Instruktion (SSE4.2 crc32, ARMv8 CRC32C) implementiert ist, was es um ein Mehrfaches schneller macht als den klassischen CRC-32.
Kann ich einen CRC inkrementell berechnen?
Ja. Alle diese CRCs lassen sich von einem vorherigen Wert aus fortsetzen, so funktioniert zlib.crc32(data, previous). Diese Seite berechnet die gesamte Eingabe auf einmal.