01. Il CRC

Il controllo ciclico di ridondanza (CRC) è una tecnica di controllo degli errori molto usata, ad esempio nelle reti Ethernet.

Essa consiste nel proteggere i dati da trasmettere con un codice di controllo (detto CRC), calcolato con l'ausilio dell'aritmetica modulare (che prevede l'analisi dei resti) tra polinomi.

Ad ogni sequenze binaria è associato un polinomio i cui coefficienti corrispondono alla sequenza binaria. Così, per esempio, la sequenza di dieci cifre binarie  0110101001 può essere associata al polinomio di grado 9:

0*x9 + 1*x8 + 1*x7 + 0*x6 + 1*x5 + 0*x4 + 1*x3 + 0*x2 + 0*x1 + 1*x0 

Sia M una sequenza di bit di lunghezza predefinita, con M(x) rappresentiamo il polinomio associato. 

Sia ancora G(x) un polinomio predefinito (detto polinomio generatore) di grado inferiore a M(x). Per fissare le idee sia

 G(x) = 1*x3 + 0*x2 + 0*x1 + 1*x0

Sia M' un messaggio ottenuto da M aggiungendo alcuni bit (il codice CRC) tale che il resto della divisione polinomiale tra M'(x) e G(x) sia uguale a 0; cioè:

Resto[M'(x) / G(x)] = 0

Il messaggio M' corrisponde alla sequenza da spedire.

Il ricevente del messaggio M' può verificarne la correttezza semplicemente controllando il resto della divisione tra i polinomi M'(x) e G(x).

Nella pratica i polinomi generatori sono standardizzati e sono di grado 12, 16 o 32.  


Calcolo del CRC

Il calcolo del CRC, come detto, utilizza l'aritmetica modulare tra i polinomi. Questa operazione è estremamente semplice e si implementa eseguendo in cascata una successione di XOR termine a termine, come illustra il seguente esempio:

Consideriamo un generico polinomio M(x) e un secondo polinomio G(x) di grado inferiore.

M(x)=0*x9 + 1*x8 + 1*x7 + 0*x6 + 1*x5 + 0*x4 + 1*x3 + 0*x2 + 0*x1 + 1*x0

G(x) = 1*x3 + 0*x2 + 0*x1 + 1*x0

Per effettuare la divisione modulare tra i due polinomi si procede in modo simile a come si opera con i numeri con le seguenti differenze:

Procedendo con l'esempio si ha:

In rosso sono mostrati i valori ottenuti applicando l'operatore XOR tra i termini in colonna.

Da evidenziare che il risultato che interessa  ai fini del CRC è esclusivamente il resto.

R(x) =  1*x1 + 0*x0


Un esempio numerico

Il procedimento utilizzato per il calcolo del CRC potrebbe funzionare in modo analogo con sequenze numeriche qualsiasi, senza necessità di richiamare l'aritmetica modulare tra i polinomi.

Il vantaggio introdotto dalla divisione modulare tra polinomi è algoritmico, in quanto si tratta di un'operazione estremamente meno complessa della divisione ordinaria.  

Proseguendo nell'analogia fissiamo un numero G che chiameremo generatore (ad esempio 999) e un numero molto più grande M (ad esempio 345678912) per il quale calcoleremo un CRCn (analogo al CRC per procedimento ma utilizzando la divisione ordinaria tra numeri decimali).


Il massimo resto che può produrre la divisione M/G è di 3 cifre, quindi estendiamo M di 3 cifre

Me = 345678912000

R = Me % G = 936

La sequenza numerica M estesa con il CRCn (evidenziato in verde) sarà:

M' = Me + (G - R) = 345678912000 + (999 - 936) = 345678912063

Osserviamo esplicitamente che:

M' % G = 345678912063 % 999 = 0

Cambiando una o più cifre casualmente a M' è altamente improbabile (all'incirca 1 su 1000) riuscire ad ottenere una sequenza che continui a godere di tale proprietà.