Come si usa
- Digita o incolla un testo, imposta Formato input su Esadecimale per inserire byte grezzi oppure apri un file per calcolare il checksum del suo contenuto.
- In Algoritmo lascia CRC-32 per ZIP, gzip e PNG, oppure scegli CRC-32C per iSCSI, ext4, Btrfs e Google Cloud Storage.
- In Formato output scegli hex (minuscole), HEX (maiuscole), Decimale o Base64.
- Per verificarlo, incolla il checksum atteso in Confronta con, in esadecimale senza 0x, in decimale o in Base64.
Che cos’è un checksum CRC32
Un controllo di ridondanza ciclico tratta l’input come un unico, lungo polinomio binario, lo divide per un polinomio generatore fisso e ne conserva il resto. Per CRC-32 il resto è di 32 bit, di solito scritto come 8 cifre esadecimali o come numero senza segno da 0 a 4.294.967.295. Quasi qualsiasi modifica ai dati cambia il resto.
I CRC sono pensati per gli errori prodotti nella realtà da cavi, collegamenti radio e dischi. CRC-32 rileva ogni raffica di bit errati lunga fino a 32 bit, e un danneggiamento casuale passa inosservato solo in circa un caso su 4,3 miliardi. È anche velocissimo da calcolare, ed è per questo che è integrato in ZIP, gzip, PNG e nei frame Ethernet.
CRC-32 e CRC-32C
| CRC-32 | CRC-32C (Castagnoli) | |
|---|---|---|
| Polinomio | 0x04C11DB7, riflesso 0xEDB88320 | 0x1EDC6F41, riflesso 0x82F63B78 |
Valore di controllo di 123456789 | cbf43926 | e3069283 |
| Usato da | ZIP, gzip, PNG, Ethernet | iSCSI, SCTP, metadati ext4, Btrfs, Google Cloud Storage |
| Supporto hardware | Istruzioni CRC32 di ARMv8 | Istruzione crc32 di x86 SSE4.2, ARMv8 |
Entrambi partono da 0xFFFFFFFF, elaborano i bit di ogni byte a partire dal meno significativo e invertono il valore finale; cambia solo il polinomio, quindi gli stessi dati danno due risultati senza alcuna relazione tra loro. Il primo è ciò che la maggior parte degli strumenti intende per "CRC32" ed è catalogato come CRC-32/ISO-HDLC. CRC-32C è stato adottato in seguito da protocolli di storage e di rete per la sua migliore capacità di rilevare gli errori. Google Cloud Storage riporta il CRC-32C, e Amazon S3 l’una o l’altra variante, come Base64 dei quattro byte in ordine big-endian, ed è esattamente ciò che mostra l’output Base64.
Un checksum, non un controllo di sicurezza
Un CRC protegge dagli errori accidentali, non dagli attacchi. È una funzione lineare, quindi chiunque può modificare un file e poi ritoccare quattro byte per lasciarne invariato il CRC-32. Un CRC corrispondente, quindi, non dimostra nulla in caso di manomissione intenzionale. Per verificare un download confronta un hash SHA-256 ottenuto da una fonte attendibile; per dimostrare chi ha inviato un messaggio usa un HMAC.
Inoltre 32 bit sono troppo pochi per identificare dei dati. Già con circa 77.000 file casuali, la probabilità che due abbiano lo stesso CRC-32 raggiunge il 50%, quindi non usarlo come ID univoco o come chiave di deduplicazione. Quando non ci sono attaccanti in gioco, MD5 o SHA-256 sono impronte di gran lunga migliori.
CRC32 nel codice
# Python: zlib.crc32 restituisce un valore senza segno in Python 3;
# "& 0xffffffff" serve solo in Python 2
import zlib
format(zlib.crc32(b'123456789'), '08x') # 'cbf43926'
// Node.js 20.15+ e 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0') // 'cbf43926'
// Go (import "hash/crc32")
crc32.ChecksumIEEE(data) // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli)) // CRC-32C
// Java: java.util.zip.CRC32 e, da Java 9, java.util.zip.CRC32C
// PHP
sprintf('%08x', crc32('123456789')); // 'cbf43926'
hash('crc32b', '123456789'); // 'cbf43926', lo stesso CRC-32
hash('crc32c', '123456789'); // 'e3069283'
hash('crc32', '123456789'); // '181989fc', un CRC diverso
Attenzione ai nomi in PHP: l’algoritmo di hash chiamato crc32 non è il checksum di ZIP ma il CRC usato da bzip2, stampato con i byte in ordine inverso. Usa crc32b o la funzione crc32() per ottenere lo stesso risultato di ZIP, gzip e di questo strumento. Il comando Unix cksum usa un’altra variante ancora, che tiene conto anche della lunghezza del file, quindi il suo numero non corrisponderà a nessuno dei due.
Esempi
| Input (UTF-8) | CRC-32 |
|---|---|
Hello, World! | ec4ac3d0 |
Base64.is | 915d7207 |
你好 | 50a2b841 |
Domande frequenti
Qual è il CRC32 di "123456789"?
cbf43926 (3421780262 in decimale) e il suo CRC-32C è e3069283. Se la tua implementazione restituisce questi valori, usa gli stessi parametri di questo strumento.Perché il mio CRC32 è diverso da quello di un altro strumento?
cksum POSIX danno tutti risultati diversi), i byte di input (terminatori di riga, un carattere di nuova riga finale, la codifica del testo), il formato del numero (alcuni linguaggi restituiscono un intero a 32 bit con segno, per cui i valori grandi diventano negativi) e l’ordine dei byte.Perché i byte del CRC sono invertiti nel mio file ZIP o gzip?
unzip -v e la maggior parte degli altri programmi stampano per primo il byte più significativo.Posso calcolare il CRC32 di un file di grandi dimensioni?
Sì. Fai clic su Apri file e il checksum viene calcolato sui byte del file direttamente sul tuo dispositivo, senza caricarlo; funziona con qualsiasi file che il browser riesca a tenere in memoria. Puoi poi confrontare il risultato con il valore riportato in un file SFV o nell’elenco di un archivio ZIP.
CRC32 è una funzione di hash?
Trasforma dati di qualsiasi lunghezza in un valore fisso di 32 bit, per questo viene spesso elencato insieme agli hash, ma è un checksum: rileva gli errori accidentali e non offre alcuna protezione contro chi modifica i dati di proposito. Quando ti serve un’impronta più robusta, la tabella Tutti gli algoritmi sotto il risultato mostra MD5 e la famiglia SHA per lo stesso input.