Cos’è un CRC
Un controllo di ridondanza ciclico tratta il messaggio come un lungo numero binario e lo divide per un polinomio fisso; il resto è la checksum. Se un singolo bit, o una raffica di bit più corta del CRC, si inverte, il resto cambia, ed è per questo che i CRC proteggono frame Ethernet, voci ZIP, chunk PNG, settori di disco e protocolli seriali. Sono veloci in hardware e in software, ma non crittografici: chiunque può fabbricare dati con il CRC che vuole.
Perché esistono così tanti «CRC-16»
Due implementazioni della stessa larghezza possono differire in cinque parametri, e ogni combinazione è una checksum diversa:
| Parametro | Significato |
|---|---|
| Polinomio | Il divisore, scritto senza il suo bit più alto (0x1021 per CCITT, 0x04C11DB7 per CRC-32). |
| Init | Il valore iniziale del registro, 0 o tutti uno. |
| Rifletti input | Se ogni byte di input viene elaborato partendo dal bit meno significativo (sì per CRC-32, MODBUS; no per CCITT-FALSE, XMODEM). |
| Rifletti output | Se il registro finale viene invertito bit per bit. |
| XOR out | Uno XOR finale, di solito 0 o tutti uno. |
Il modo standard di identificare una variante è il suo valore di controllo: il CRC della stringa ASCII 123456789. La tabella qui sopra lo mostra per ogni modello, e l’input predefinito è esattamente quella stringa; se un dispositivo ti dà una checksum per dati noti, puoi confrontarla con tutte le varianti in una volta.
Varianti comuni
- CRC-32 (0x04C11DB7, riflesso): Ethernet, ZIP, gzip, PNG,
zlib.crc32,cksum -o 3. - CRC-32C (Castagnoli): iSCSI, SCTP, metadati ext4, Btrfs, LevelDB; ha un’istruzione hardware su x86 e ARM ed è quindi la scelta veloce per i nuovi progetti.
- CRC-16/MODBUS: Modbus RTU su seriale; CRC-16/CCITT-FALSE: Bluetooth, molte menzioni di «CRC-CCITT»; CRC-16/XMODEM: XMODEM,
binascii.crc_hqxdi Python. - Adler-32: flussi zlib; più veloce del CRC ma più debole su input corti.
Domande
Un CRC è la stessa cosa di un hash?
No. Un CRC rileva la corruzione accidentale ed è banale da invertire o falsificare. Per l’integrità contro un attaccante o per identificare file usa SHA-256. Per la velocità su un canale fidato, il CRC va bene.
Il mio dispositivo dà un CRC-16 diverso da questa pagina.
Esistono almeno una dozzina di varianti di CRC-16. Inserisci i dati che il dispositivo ha controllato e confronta il suo valore con ogni riga della tabella; la riga che corrisponde ti dice polinomio, init e riflessione del dispositivo. Se nessuna corrisponde, prova il modello personalizzato e verifica se il dispositivo include un byte di lunghezza o un indirizzo nei dati.
Che ordine di byte ha il risultato?
Il CRC è mostrato come numero. Quando viene scritto in un pacchetto, è il protocollo a decidere l’ordine: MODBUS manda prima il byte basso, XMODEM quello alto. Controlla la specifica o un frame di esempio.
Cos’è CRC-32C e perché lo usano i database?
CRC-32 con il polinomio di Castagnoli, che rileva meglio gli errori alle dimensioni di blocco dei sistemi di storage ed è implementato come singola istruzione CPU (SSE4.2 crc32, ARMv8 CRC32C), il che lo rende molte volte più veloce del CRC-32 classico.
Posso calcolare un CRC in modo incrementale?
Sì. Tutti questi CRC possono continuare da un valore precedente, è così che funziona zlib.crc32(data, previous). Questa pagina calcola tutto l’input in una volta.