Comprovació de redundància cíclica
La comprovació de la redundància cíclica (és a dir , la comprovació de la redundància cíclica, CRC les sigles de la qual és més freqüent) és un mètode per al càlcul de sumes de comprovació (checksum en anglès). El nom deriva del fet que les dades de sortida s’obtenen processant les dades d’entrada que es desplacen cíclicament en una xarxa lògica . La comprovació CRC és molt popular perquè la seva implementació binària és senzilla de fer, requereix coneixements matemàtics modestos per a l’estimació d’errors i és molt adequada per detectar errors de transmissió en línies afectades per un alt soroll de fons. Wesley Peterson va inventar les tècniques CRC que va publicar el seu primer treball sobre el tema el 1961 . [1]
Útil per identificar errors aleatoris en la transmissió de dades (a causa d’interferències, soroll de línia, distorsió), el CRC, en canvi, no és fiable per verificar la completa correcció de les dades contra intents de manipulació intencionats. Per a això, s’utilitzen algoritmes de hash com MD5 i SHA1, que són més robustos encara que computacionalment menys eficients.
Implementació
El CRC preveu la generació d’una cadena de bits de control que normalment es transmeten juntament amb les dades i el càlcul es basa en l’ aritmètica modular . Un codi CRC es defineix pel seu polinomi generador: per exemple, el codi CRC-16-CCITT, àmpliament utilitzat en telecomunicacions, el defineix el polinomi generador .
El càlcul del CRC comença amb el missatge associat a un polinomi de grau igual al nombre de bits del missatge menys un, grau que indicarem amb .
Per exemple, el missatge 10011010 ( ) dóna el polinomi
Suposant que el CRC té un polinomi de grau , "desplaçem" el polinomi cap a l'esquerra des de posicions, obtenint el polinomi grau ( ).
A l'exemple, assumint un títol obtens:
Ara es realitza la divisió obtenint un quocient i un descans . Aquesta divisió es duu a terme amb la divisió llarga de l'aritmètica del mòdul 2, és a dir, no es fan transferències: recordeu que en l'aritmètica del mòdul 2 es pot realitzar la suma i la resta mitjançant la funció lògica XOR . El missatge enviat al llarg del canal està format per la unió del missatge menys la resta de la divisió .
Considerant això és la resta d'una divisió que utilitza com a divisor , aquesta resta té un grau estrictament inferior al de ; recordant-ho també s’obté prenent el missatge que s’enviarà i traduir-lo per g posicions, és a dir, pel grau del polinomi , obtenim que els polinomis I , sumats, no se superposen en termes d'igual grau i, per tant, podem suposar que el missatge s'envia "inalterat".
també es pot definir com
És a dir, el polinomi és igual al quocient vegades el divisor més la resta. En substituir aquesta descripció a la fórmula anterior ho obtindrem es converteix en:
Per les lleis de l'àlgebra sobre camps finits , restant un polinomi de si mateix, obtenim un polinomi nul, per tant esdevé:
Observem que, per tant, el missatge és divisible pel polinomi generador amb zero residus. La detecció d'errors utilitza aquesta propietat, de fet el receptor rep i el divideix pel polinomi que es defineix més amunt. Si el missatge s'ha rebut sense canvis, la divisió no produeix cap canvi, mentre que si s'han produït errors de transmissió, la divisió produirà un canvi. La presència de múltiples errors encara podria produir una divisió sense cap resta en un missatge erroni. La probabilitat que això passi depèn del polinomi i del seu grau (és demostrable), però rarament passa això.
Si el missatge dóna zero residus, només cal traduir a la dreta d'un grau g per obtenir el missatge de sortida.
Exemple
Aquí hi ha una implementació senzilla a Python . Penseu en dos dispositius A i B, on A és el transmissor i B el receptor.
Suposem que volem transmetre de A a B una data de naixement en el format dd-mm-aaaa on, cada dígit de la data correspon a un byte.
Per tant, el missatge a transmetre tindrà una longitud de 64 bits (sense guions).
'' '
Extraieu els divisors del polinomi
'' '
def obté Divisors polinomials ( polinomi ):
polinomi Bin = bin ( polinomi )
divisors = []
per a idx , b a enumerar ( polinomi Bin [ 2 :], inici = 1 ):
si b == '1' :
separadors . append ( 1 << (( len ( polynomialBin [ 2 :]) - idx )))
divisors de retorn
'' '
Trobeu la resta de les divisions de cada divisor extrapolades del polinomi.
Si la resta de la divisió amb l'últim divisor és 0, llavors és correcte
'' '
def isCorrect ( missatge rebut , divisors ):
temp = missatge rebut
per a idx , valor en enumerar ( divisors ):
temp % = valor
si temp == 0 i idx < len ( divisors ) - 1 :
temp = - 1
trencar
temperatura de retorn
#coding una plantilla del missatge que es transmetrà en format binari (per exemple: 01-01-2000)
message = int ( "0000000000000001000000000000000100000010000000000000000000000000" , 2 )
print ( "Valor del missatge: % d " % missatge )
# transforma el polinomi escollit en la seva representació binària (x ^ 5 + x ^ 2 + 1)
polinomi = int ( '100101' , 2 )
print ( "Valor polinòmic: % d " % polinomi )
#modeu el missatge cap a l'esquerra en 5 posicions perquè el polinomi és de cinquè grau
missatge = missatge << 5
print ( "Valor del missatge: % d " % missatge )
# Calculo el crc que resulta ser la resta de la divisió entre el missatge i el polinomi
crc = missatge % polinomi
print ( "valor CRC: % s " % bin ( crc ))
#coding del missatge a transmetre en format binari (Ex: 08-12-1988)
messageToTransmit = int ( '0000000000001000000000000000000000000000000001001000010000000001000' , 2 )
#accendiu el crc a la seqüència de bits a transmetre
messageTransmitting = (( messageTransmitting << 5 ) | crc )
print ( "Valor del missatge a transmetre: % d " % messageToTransmit )
# Rebre divisors per a divisions polinòmiques
divisors = getPolinomialDivisors ( polinomi )
print ( "Divisors" , divisors )
#Comproveu el resultat
result = isCorrect (messaggioDaTrasmettere, divisors)
x = True si result == 0 else False
print ( "Resultat: % r " % x )
'' '
Sortida:
Valor del missatge: 281479305232384
Valor polinòmic: 37
Valor del missatge: 18014675534872576
Valor CRC: 0b11001
Valor del missatge a transmetre: 72093053843734809
Divisors: [32, 4, 1]
Resultat: cert
'' '
Nota
- ↑ Peterson, W. Wκ. i Brown, DT, Codis cíclics per a la detecció d’errors , a Proceedings of the IRE , gener de 1961, DOI : 10.1109 / JRPROC.1961.287814 , ISSN 0096-8390 . - El document original sobre CRC