Domanda: CRC Verse Checksum verifica per unità flash USB?
Domanda: È Checksum o CRC meglio per controllare i dati scritti su unità flash USB?
Questo post offre una panoramica semplice per capire quale metodo di verifica è migliore quando si scrivono dati su una chiavetta USB. In fondo trovi collegamenti di riferimento che approfondiscono entrambi i metodi se questa introduzione non è sufficiente.
Risposta breve: il Controllo di Ridondanza Ciclica (CRC) è generalmente il metodo migliore per verificare i dati scritti su un’unità flash USB.
Molti pensano che un checksum sia la scelta migliore (il più popolare è l’MD5) perché è più semplice da comprendere e da implementare. Tuttavia, la verifica basata su checksum presenta difetti e, per questo, non è ideale per convalidare i dati scritti su una chiavetta USB.
Qual è la differenza tra somma di controllo e verifica CRC? Il metodo checksum usa l’addizione nei calcoli matematici per verificare se tutti i dati sono stati scritti correttamente. Il CRC usa la divisione lunga binaria nei propri calcoli per determinare la correttezza dei dati.
I metodi basati su checksum contano i bit totali in un pacchetto di dati e includono tale somma quando i dati vengono trasmessi. Il ricevitore legge il valore di checksum e ripete il calcolo per verificare che tutto torni. Anche quando i totali coincidono, esiste un’elevata probabilità che durante la trasmissione alcuni bit siano cambiati o scambiati, producendo comunque un valore “corretto” al termine del calcolo.

In termini molto semplici: immagina un bidone con arance e mele rosse spedito da Los Angeles a New York. Si conta tutto prima della spedizione, ma lungo il percorso alcune mele rosse vengono sostituite con mele verdi. All’arrivo il numero totale di frutti è lo stesso, ma il ricevitore non sa che dovevano essere solo mele rosse. Il checksum “torna”, ma il contenuto effettivo è cambiato.
Il CRC è altrettanto “semplice” come concetto di aggiunta, ma utilizza la divisione lunga. Il vantaggio è che “guarda” l’intero pacchetto per confermare l’integrità, invece di affidarsi a una somma totale. Come nella divisione lunga tradizionale, la divisione binaria opera sul dividendo usando il divisore.
Poiché il CRC è più complesso da spiegare, riprendiamo l’esempio delle mele e arance: questa volta frutti su vassoi (come in una scatola di uova), impilati ordinatamente. Il manifesto specifica numero di strati, quantità e colori. All’arrivo, il ricevitore può verificare facilmente sia gli strati che la composizione: non solo il totale, ma anche la struttura—proprio come fa il CRC sull’intero pacchetto.
Nel calcolo CRC si sceglie un polinomio/divisore “dato”. Si aggiungono alla fine del pacchetto tanti zeri quanto la lunghezza del divisore meno uno e si esegue la divisione binaria lunga. Si ottiene un resto: la parte “ciclica” consiste nel sostituire quei bit finali con il resto, cosicché alla verifica (nuova divisione) il resto risulti zero se non ci sono errori. In questo modo, tutti i bit del pacchetto vengono effettivamente considerati.
Un aiuto visivo rende tutto più chiaro; osserva i grafici seguenti e il processo avrà più senso.

La scelta del metodo di verifica nella trasmissione dati nasce spesso dal “rumore” sulle linee, non da attacchi intenzionali. Il rumore può derivare da cattivo design elettrico (per esempio PCB della chiavetta), messa a terra insufficiente (molte chiavette usano due PCB, ma la specifica USB indica PCB a quattro strati), o materiali scadenti. Con un metodo affidabile come il CRC, il ricevitore può determinare con maggiore confidenza se i dati sono stati inviati e ricevuti correttamente.
Fonte: Grazie agli ingegneri Nexcopy Inc. per aver reso accessibile un argomento tecnico complesso.
Riferimenti:
- Binary Long Division
https://courses.cs.vt.edu/~cs1104/BuildingBlocks/divide.030.html - Definizioni CRC (Wikipedia)
https://en.wikipedia.org/wiki/Cyclic_redundancy_check - Teoria e codice CRC in C/C++ (Barr Group)
https://www.barrgroup.com/Embedded-Systems/How-To/CRC-Math-Theory