Verificarea redundanței ciclice _ , CRC [1] ) este un algoritm pentru găsirea unei sume de control conceput pentru a verifica integritatea datelor [2] . CRC este o aplicație practică a codificării de corectare a erorilor bazată pe anumite proprietăți matematice ale unui cod ciclic .
Conceptul de coduri ciclice este destul de larg [3] . În literatura engleză, CRC este înțeles în două moduri, în funcție de context: Cyclic Redundancy Code sau Cyclic Redundancy Check [4] . Primul concept înseamnă fenomenul matematic al codurilor ciclice, al doilea - aplicarea specifică a acestui fenomen ca funcție hash .
Codurile ciclice nu sunt doar ușor de implementat, dar au și avantajul de a fi potrivite pentru detectarea erorilor de explozie: secvențe continue de caractere de date eronate în mesaje. Acest lucru este important deoarece erorile de rafală sunt erori comune de transmisie în multe canale de comunicație, inclusiv dispozitivele de stocare magnetice și optice. În mod obișnuit, un CRC de n biți, aplicat unui bloc de date de lungime arbitrară și cu suma de control imediat după date, detectează orice explozie unică de erori care nu depășește n biți și proporția tuturor exploziilor mai lungi de erori pe care le detectează este (1 − 2 −n ).
Primele încercări de a crea coduri cu informații redundante au început cu mult înainte de apariția computerelor moderne. De exemplu, în anii 1960, Reed și Solomon au dezvoltat o tehnică de codificare eficientă - Codul Reed-Solomon . Utilizarea acestuia la acel moment nu era posibilă, deoarece primii algoritmi nu puteau efectua operația de decodare într-un timp rezonabil . Lucrarea fundamentală a lui Berlekamp , publicată în 1968, a pus capăt acestei probleme . Această tehnică , a cărei aplicare practică a subliniat Massey un an mai târziu , este încă folosită în dispozitivele digitale care primesc date codificate RS până în prezent. Mai mult: acest sistem permite nu numai determinarea pozițiilor, ci și corectarea simbolurilor codurilor incorecte (cel mai adesea octeți ).
Dar este departe de a fi întotdeauna necesară corectarea erorilor din cod . Multe canale de comunicare moderne au caracteristici acceptabile și de multe ori este suficient să se verifice dacă transferul a avut succes sau dacă au existat dificultăți ; structura erorilor și pozițiile specifice ale simbolurilor incorecte nu prezintă deloc interes pentru partea care primește. Și în aceste condiții, algoritmii care utilizează sume de control s-au dovedit a fi o soluție de mare succes. CRC este cel mai potrivit pentru astfel de sarcini: costurile reduse ale resurselor, ușurința de implementare și aparatul matematic deja format din teoria codurilor ciclice liniare i-au asigurat popularitatea imensă.
Deși codul CRC este utilizat de obicei doar pentru detectarea erorilor, proprietățile sale matematice fac posibilă găsirea și corectarea unei singure erori într-un bloc de biți dacă fiecare bit al blocului protejat (inclusiv biții de verificare) are propriul său rest unic atunci când este împărțit. prin polinomul generator. De exemplu, dacă polinomul generator este ireductibil și lungimea blocului nu depășește ordinul grupului ciclic generat.
În general, suma de control este o valoare calculată după o anumită schemă bazată pe mesajul codificat. Informațiile de verificare în codificare sistematică sunt atribuite datelor transmise. Pe partea de recepție, abonatul cunoaște algoritmul pentru calcularea sumei de control: în consecință, programul are capacitatea de a verifica corectitudinea datelor primite.
Când pachetele sunt transmise pe un canal de rețea, informațiile sursă pot fi distorsionate din cauza diferitelor influențe externe: interferențe electrice, condiții meteorologice nefavorabile și multe altele. Esența tehnicii este că, cu caracteristici bune ale sumei de control, în marea majoritate a cazurilor, o eroare în mesaj va duce la o modificare a sumei de control. Dacă sumele inițiale și cele calculate nu sunt egale, se ia o decizie cu privire la invaliditatea datelor primite și se poate solicita o retransmitere a pachetului.
Algoritmul CRC se bazează pe proprietățile divizării cu un rest de polinoame binare, adică polinoame peste un câmp finit . Valoarea CRC este în esență restul împărțirii polinomului corespunzător intrării la un polinom fix generator .
Fiecare secvență finită de biți este unu-la-unu asociată cu un polinom binar a cărui secvență de coeficienți este secvența originală. De exemplu, secvența de biți 1011010 corespunde polinomului:
Numărul de polinoame distincte de grad mai mic decât este egal cu , care este același cu numărul tuturor secvențelor binare de lungime .
Valoarea sumei de control dintr-un algoritm cu un grad de polinom generator este definită ca o secvență de biți de lungime , reprezentând polinomul care rezultă în restul împărțirii polinomului , reprezentând fluxul de biți de intrare, la polinomul :
Unde
este un polinom reprezentând valoarea CRC; este un polinom ai cărui coeficienți reprezintă datele de intrare; este un polinom generator; este gradul polinomului generator.Înmulțirea se realizează prin alocarea de biți zero secvenței de intrare, ceea ce îmbunătățește calitatea hashingului pentru secvențele scurte de intrare.
Când împărțim cu un rest de diverse polinoame originale cu un polinom generator de grad , se pot obține diverse resturi din diviziune. este adesea un polinom ireductibil . De obicei, este selectat în conformitate cu cerințele pentru o funcție hash în contextul fiecărei aplicații particulare.
Cu toate acestea, există multe generatoare de polinoame standardizate care au proprietăți matematice și de corelare bune (număr minim de coliziuni , ușurință de calcul), dintre care unele sunt enumerate mai jos.
Unul dintre principalii parametri ai CRC este polinomul generator.
Un alt parametru asociat cu polinomul generator este gradul acestuia , care determină numărul de biți utilizați pentru a calcula valoarea CRC. În practică, cuvintele de 8, 16 și 32 de biți sunt cele mai comune, ceea ce este o consecință a particularităților arhitecturii tehnologiei computerizate moderne.
Un alt parametru este valoarea inițială (de pornire) a cuvântului. Acești parametri definesc complet algoritmul de calcul „tradițional” CRC. Există, de asemenea, modificări ale algoritmului, de exemplu, folosind ordinea inversă a biților de procesare.
Primul cuvânt este preluat din fișier - poate fi un bit (CRC-1), octet (CRC-8) sau orice alt element. Dacă bitul cel mai semnificativ din cuvânt este „1”, atunci cuvântul este deplasat la stânga cu un bit, urmat de o operație XOR cu un polinom generator. În consecință, dacă bitul cel mai semnificativ din cuvânt este „0”, atunci operația XOR nu este efectuată după schimbarea . După schimbare, bitul cel mai semnificativ este pierdut, iar următorul bit din fișier este încărcat în locul celui mai puțin semnificativ, iar operația se repetă până când ultimul bit al fișierului este încărcat. După ce parcurgeți întregul fișier, restul rămâne în cuvânt, care este suma de control.
În timp ce codurile de redundanță ciclică fac parte din standarde, acest termen nu are o definiție general acceptată - interpretările diverșilor autori se contrazic deseori [1] [5] .
Acest paradox se aplică și alegerii unui polinom generator: adesea polinoamele standardizate nu sunt cele mai eficiente în ceea ce privește proprietățile statistice ale codului de redundanță de verificare corespunzător .
Cu toate acestea, multe polinoame utilizate pe scară largă nu sunt cele mai eficiente dintre toate posibilele. În 1993-2004, un grup de oameni de știință s-a angajat în studiul generării de polinoame cu capacitate de până la 16 [1] 24 și 32 de biți [6] [7] și au găsit polinoame care oferă performanțe mai bune decât polinoamele standardizate în ceea ce privește distanța de cod. [7] . Unul dintre rezultatele acestui studiu și-a găsit deja drumul în protocolul iSCSI .
Cel mai popular și recomandat polinom IEEE pentru CRC-32 este utilizat în Ethernet , FDDI ; de asemenea, acest polinom este un generator de cod Hamming [8] . Folosirea unui alt polinom - CRC-32C - vă permite să obțineți aceeași performanță cu lungimea mesajului original de la 58 de biți la 131 kbps, iar în unele intervale de lungime a mesajului de intrare poate fi și mai mare, deci este, de asemenea, popular astăzi [7] . De exemplu, standardul ITU-T G.hn folosește CRC-32C pentru a detecta erorile în sarcina utilă.
Tabelul de mai jos enumeră cele mai comune polinoame - generatoare CRC. În practică, calculul CRC poate include pre- și post-inversie, precum și ordinea inversă a procesării biților. Implementările proprietare ale CRC folosesc valori inițiale diferite de zero pentru a face codul mai dificil de analizat.
Nume | Polinom | Reprezentări: [9] normal / inversat / inversat de la invers |
---|---|---|
CRC-1 | (utilizat în verificarea erorilor hardware; cunoscut și ca bit de paritate ) | 0x1 / 0x1 / 0x1 |
CRC-4-ITU | ( ITU G.704 [10] ) | 0x3 / 0xC / 0x9 |
CRC-5-EPC | ( RFID Gen 2 [11] ) | 0x09 / 0x12 / 0x14 |
CRC-5-ITU | ( ITU G.704 [12] ) | 0x15 / 0x15 / 0x1A |
CRC-5-USB | ( pachete de jetoane USB ) | 0x05 / 0x14 / 0x12 |
CRC-6-ITU | ( ITU G.704 [13] ) | 0x03 / 0x30 / 0x21 |
CRC-7 | (sisteme de telecomunicații, ITU-T G.707 [14] , ITU-T G.832 [15] , MMC , SD ) | 0x09 / 0x48 / 0x44 |
CRC-8- CCITT | ( ATM HEC ), Controlul erorilor antet ISDN și delimitarea celulei ITU-T I.432.1 (02/99) | 0x07 / 0xE0 / 0x83 |
CRC-8- Dallas / Maxim | ( autobuz cu 1 fir ) | 0x31 / 0x8C / 0x98 |
CRC-8 | ( ETSI EN 302 307 [16] , 5.1.4) | 0xD5 / 0xAB / 0xEA [1] |
CRC-8-SAE J1850 | 0x1D / 0xB8 / 0x8E | |
CRC-10 | 0x233 / 0x331 / 0x319 | |
CRC-11 | ( FlexRay [17] ) | 0x385 / 0x50E / 0x5C2 |
CRC-12 | (sisteme de telecomunicații [18] [19] ) | 0x80F / 0xF01 / 0xC07 |
CRC-15- CAN | 0x4599 / 0x4CD1 / 0x62CC | |
CRC-16- IBM | ( Bisync , Modbus , USB , ANSI X3.28 [20] , multe altele; cunoscute și ca CRC-16 și CRC-16-ANSI ) | 0x8005 / 0xA001 / 0xC002 |
CRC-16-CCITT | ( X.25 , HDLC , XMODEM , Bluetooth , SD etc.) | 0x1021 / 0x8408 / 0x8810 [1] |
CRC-16- T10 - DIF | ( SCSI DIF) | 0x8BB7 [21] / 0xEDD1 / 0xC5DB |
CRC-16- DNP | (DNP, IEC 870 , M-Bus ) | 0x3D65 / 0xA6BC / 0x9EB2 |
CRC-16-Fletcher | Nu CRC; vezi suma de control a lui Fletcher | Folosit în Adler-32 A&B CRC |
CRC-24 | ( FlexRay [17] ) | 0x5D6DCB / 0xD3B6BA / 0xAEB6E5 |
CRC-24 Radix-64 | ( OpenPGP ) | 0x864CFB / 0xDF3261 / 0xC3267D |
CRC-30 | ( CDMA ) | 0x2030B9C7 / 0x38E74301 / 0x30185CE3 |
CRC-32-Adler | Nu CRC; vezi Adler-32 | Vezi Adler-32 |
CRC-32 - IEEE 802.3 | ( V.42 , MPEG-2 , PNG [22] , CKsum POSIX ) | 0x04C11DB7 / 0xEDB88320 / 0x82608EDB [7] |
CRC-32C (Castagnoli) | ( iSCSI , sarcină utilă G.hn ) | 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0 [7] |
CRC-32K (Koopman) | 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B [7] | |
CRC-32Q | (aviație; AIXM [23] ) | 0x814141AB / 0xD5828281 / 0xC0A0A0D5 |
CRC-64-ISO | ( HDLC - ISO 3309 ) | 0x000000000000001B / 0xD800000000000000 / 0x8000000000000000D |
CRC-64- ECMA | [24] | 0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49 |
Standardele existente CRC-128 (IEEE) și CRC-256 (IEEE) în prezent[ când? ] au fost înlocuite de funcțiile hash criptografice .
Una dintre cele mai cunoscute este tehnica Ross N. Williams [25] . Utilizează următoarele opțiuni:
Nume | Lăţime | Poli | Init | RefIn | Ref Out | XorOut | Verifica |
---|---|---|---|---|---|---|---|
CRC-3/ROHC | 3 | 0x3 | 0x7 | Adevărat | Adevărat | 0x0 | 0x6 |
CRC-4/ITU | patru | 0x3 | 0x0 | Adevărat | Adevărat | 0x0 | 0x7 |
CRC-5/EPC | 5 | 0x9 | 0x9 | fals | fals | 0x0 | 0x0 |
CRC-5/ITU | 5 | 0x15 | 0x0 | Adevărat | Adevărat | 0x0 | 0x7 |
CRC-5/USB | 5 | 0x5 | 0x1F | Adevărat | Adevărat | 0x1F | 0x19 |
CRC-6/CDMA2000-A | 6 | 0x27 | 0x3F | fals | fals | 0x0 | 0xD |
CRC-6/CDMA2000-B | 6 | 0x7 | 0x3F | fals | fals | 0x0 | 0x3B |
CRC-6/DARC | 6 | 0x19 | 0x0 | Adevărat | Adevărat | 0x0 | 0x26 |
CRC-6/ITU | 6 | 0x3 | 0x0 | Adevărat | Adevărat | 0x0 | 0x6 |
CRC-7 | 7 | 0x9 | 0x0 | fals | fals | 0x0 | 0x75 |
CRC-7/ROHC | 7 | 0x4F | 0x7F | Adevărat | Adevărat | 0x0 | 0x53 |
CRC-8 | opt | 0x7 | 0x0 | fals | fals | 0x0 | 0xF4 |
CRC-8/CDMA2000 | opt | 0x9B | 0xFF | fals | fals | 0x0 | 0xDA |
CRC-8/DARC | opt | 0x39 | 0x0 | Adevărat | Adevărat | 0x0 | 0x15 |
CRC-8/DVB-S2 | opt | 0xD5 | 0x0 | fals | fals | 0x0 | 0xBC |
CRC-8/EBU | opt | 0x1D | 0xFF | Adevărat | Adevărat | 0x0 | 0x97 |
CRC-8/I-CODE | opt | 0x1D | 0xFD | fals | fals | 0x0 | 0x7E |
CRC-8/ITU | opt | 0x7 | 0x0 | fals | fals | 0x55 | 0xA1 |
CRC-8/MAXIM | opt | 0x31 | 0x0 | Adevărat | Adevărat | 0x0 | 0xA1 |
CRC-8/ROHC | opt | 0x7 | 0xFF | Adevărat | Adevărat | 0x0 | 0xD0 |
CRC-8/WCDMA | opt | 0x9B | 0x0 | Adevărat | Adevărat | 0x0 | 0x25 |
CRC-10 | zece | 0x233 | 0x0 | fals | fals | 0x0 | 0x199 |
CRC-10/CDMA2000 | zece | 0x3D9 | 0x3FF | fals | fals | 0x0 | 0x233 |
CRC-11 | unsprezece | 0x385 | 0x1A | fals | fals | 0x0 | 0x5A3 |
CRC-12/3GPP | 12 | 0x80F | 0x0 | fals | Adevărat | 0x0 | 0xDAF |
CRC-12/CDMA2000 | 12 | 0xF13 | 0xFFF | fals | fals | 0x0 | 0xD4D |
CRC-12/DECT | 12 | 0x80F | 0x0 | fals | fals | 0x0 | 0xF5B |
CRC-13/BBC | 13 | 0x1CF5 | 0x0 | fals | fals | 0x0 | 0x4FA |
CRC-14/DARC | paisprezece | 0x805 | 0x0 | Adevărat | Adevărat | 0x0 | 0x82D |
CRC-15 | cincisprezece | 0x4599 | 0x0 | fals | fals | 0x0 | 0x59E |
CRC-15/MPT1327 | cincisprezece | 0x6815 | 0x0 | fals | fals | 0x1 | 0x2566 |
CRC-16/ARC | 16 | 0x8005 | 0x0 | Adevărat | Adevărat | 0x0 | 0xBB3D |
CRC-16/AUG-CCITT | 16 | 0x1021 | 0x1D0F | fals | fals | 0x0 | 0xE5CC |
CRC-16/BUYPASS | 16 | 0x8005 | 0x0 | fals | fals | 0x0 | 0xFEE8 |
CRC-16/CCITT-FALSE | 16 | 0x1021 | 0xFFFF | fals | fals | 0x0 | 0x29B1 |
CRC-16/CDMA2000 | 16 | 0xC867 | 0xFFFF | fals | fals | 0x0 | 0x4C06 |
CRC-16/DDS-110 | 16 | 0x8005 | 0x800D | fals | fals | 0x0 | 0x9ECF |
CRC-16/DECT-R | 16 | 0x589 | 0x0 | fals | fals | 0x1 | 0x7E |
CRC-16/DECT-X | 16 | 0x589 | 0x0 | fals | fals | 0x0 | 0x7F |
CRC-16/DNP | 16 | 0x3D65 | 0x0 | Adevărat | Adevărat | 0xFFFF | 0xEA82 |
CRC-16/EN-13757 | 16 | 0x3D65 | 0x0 | fals | fals | 0xFFFF | 0xC2B7 |
CRC-16/GENIBUS | 16 | 0x1021 | 0xFFFF | fals | fals | 0xFFFF | 0xD64E |
CRC-16/MAXIM | 16 | 0x8005 | 0x0 | Adevărat | Adevărat | 0xFFFF | 0x44C2 |
CRC-16/MCRF4XX | 16 | 0x1021 | 0xFFFF | Adevărat | Adevărat | 0x0 | 0x6F91 |
CRC-16/RIELLO | 16 | 0x1021 | 0xB2AA | Adevărat | Adevărat | 0x0 | 0x63D0 |
CRC-16/T10-DIF | 16 | 0x8BB7 | 0x0 | fals | fals | 0x0 | 0xD0DB |
CRC-16/TELEDISK | 16 | 0xA097 | 0x0 | fals | fals | 0x0 | 0xFB3 |
CRC-16/TMS37157 | 16 | 0x1021 | 0x89EC | Adevărat | Adevărat | 0x0 | 0x26B1 |
CRC-16/USB | 16 | 0x8005 | 0xFFFF | Adevărat | Adevărat | 0xFFFF | 0xB4C8 |
CRC-A | 16 | 0x1021 | 0xC6C6 | Adevărat | Adevărat | 0x0 | 0xBF05 |
CRC-16/KERMIT | 16 | 0x1021 | 0x0 | Adevărat | Adevărat | 0x0 | 0x2189 |
CRC-16/MODBUS | 16 | 0x8005 | 0xFFFF | Adevărat | Adevărat | 0x0 | 0x4B37 |
CRC-16/X-25 | 16 | 0x1021 | 0xFFFF | Adevărat | Adevărat | 0xFFFF | 0x906E |
CRC-16/XMODEM | 16 | 0x1021 | 0x0 | fals | fals | 0x0 | 0x31C3 |
CRC-24 | 24 | 0x864CFB | 0xB704CE | fals | fals | 0x0 | 0x21CF02 |
CRC-24/FLEXRAY-A | 24 | 0x5D6DCB | 0xFEDCBA | fals | fals | 0x0 | 0x7979BD |
CRC-24/FLEXRAY-B | 24 | 0x5D6DCB | 0xABCDEF | fals | fals | 0x0 | 0x1F23B8 |
CRC-31/PHILIPS | 31 | 0x4C11DB7 | 0x7FFFFFFF | fals | fals | 0x7FFFFFFF | 0xCE9E46C |
CRC-32/ zlib | 32 | 0x4C11DB7 | 0xFFFFFFFF | Adevărat | Adevărat | 0xFFFFFFFF | 0xCBF43926 |
CRC-32/BZIP2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | fals | fals | 0xFFFFFFFF | 0xFC891918 |
CRC-32C | 32 | 0x1EDC6F41 | 0xFFFFFFFF | Adevărat | Adevărat | 0xFFFFFFFF | 0xE3069283 |
CRC-32D | 32 | 0xA833982B | 0xFFFFFFFF | Adevărat | Adevărat | 0xFFFFFFFF | 0x87315576 |
CRC-32/MPEG-2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | fals | fals | 0x0 | 0x376E6E7 |
CRC-32/POSIX | 32 | 0x4C11DB7 | 0x0 | fals | fals | 0xFFFFFFFF | 0x765E7680 |
CRC-32Q | 32 | 0x814141AB | 0x0 | fals | fals | 0x0 | 0x3010BF7F |
CRC-32/JAMCRC | 32 | 0x4C11DB7 | 0xFFFFFFFF | Adevărat | Adevărat | 0x0 | 0x340BC6D9 |
CRC-32/XFER | 32 | 0xAF | 0x0 | fals | fals | 0x0 | 0xBD0BE338 |
CRC-40/GSM | 40 | 0x4820009 | 0x0 | fals | fals | 0xFFFFFFFFFF | 0xD4164FC646 |
CRC-64 | 64 | 0x42F0E1EBA9EA3693 | 0x0 | fals | fals | 0x0 | 0x6C40DF5F0B497347 |
CRC-64/WE | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFF | fals | fals | 0xFFFFFFFFFFFFFF | 0x62EC59E3F1A4F00A |
CRC-64/XZ | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFF | Adevărat | Adevărat | 0xFFFFFFFFFFFFFF | 0x995DC9BBDF1939FA |
Funcții hash | |
---|---|
scop general | |
Criptografic | |
Funcții de generare a cheilor | |
Numărul de verificare ( comparație ) | |
Hashes |
|