bitlvl
IT

Calcolatore di CRC e checksum

Scrivi del testo, incolla byte in hex o trascina un file e ottieni tutti i CRC comuni in una volta, ognuno con i suoi parametri, per trovare la variante usata da un dispositivo o un protocollo.

Oppure trascina un file, o

Modello CRC personalizzato

Rifletti

I risultati e i messaggi di questo strumento sono mostrati in inglese.

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:

ParametroSignificato
PolinomioIl divisore, scritto senza il suo bit più alto (0x1021 per CCITT, 0x04C11DB7 per CRC-32).
InitIl valore iniziale del registro, 0 o tutti uno.
Rifletti inputSe ogni byte di input viene elaborato partendo dal bit meno significativo (sì per CRC-32, MODBUS; no per CCITT-FALSE, XMODEM).
Rifletti outputSe il registro finale viene invertito bit per bit.
XOR outUno 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_hqx di 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.