Cyklisk redundanskontrol _ _ , CRC [1] ) er en algoritme til at finde en kontrolsum designet til at kontrollere integriteten af data [2] . CRC er en praktisk anvendelse af fejlkorrigerende kodning baseret på visse matematiske egenskaber ved en cyklisk kode .
Begrebet cykliske koder er ret bredt [3] . I engelsk litteratur forstås CRC på to måder, afhængig af konteksten: Cyclic Redundancy Code eller Cyclic Redundancy Check [4] . Det første koncept betyder det matematiske fænomen af cykliske koder, det andet - den specifikke anvendelse af dette fænomen som en hash-funktion .
Cykliske koder er ikke kun nemme at implementere, men har også den fordel, at de er velegnede til at detektere burst-fejl: kontinuerlige sekvenser af fejlagtige datategn i meddelelser. Dette er vigtigt, fordi burst-fejl er almindelige transmissionsfejl i mange kommunikationskanaler, herunder magnetiske og optiske lagerenheder. Typisk detekterer en n-bit CRC, anvendt på en blok af data af vilkårlig længde, og med kontrolsummen umiddelbart efter dataene, enhver enkelt burst af fejl, der ikke er længere end n bit, og andelen af alle længere bursts af fejl, som den detekterer er (1 − 2 −n ).
De første forsøg på at skabe koder med overflødig information begyndte længe før fremkomsten af moderne computere. For eksempel, tilbage i 1960'erne, udviklede Reed og Solomon en effektiv kodningsteknik - Reed-Solomon-koden . Det var ikke muligt at bruge det på det tidspunkt, da de første algoritmer ikke kunne udføre afkodningsoperationen inden for rimelig tid . Berlekamps grundlæggende værk , udgivet i 1968, satte en stopper for dette spørgsmål . Denne teknik , den praktiske anvendelse, som Massey påpegede et år senere , bruges stadig i digitale enheder, der modtager RS-kodede data den dag i dag. Desuden: dette system gør det ikke kun muligt at bestemme positioner, men også at rette forkerte kodesymboler (oftest oktetter ).
Men det er langt fra altid, at der kræves fejlretning fra koden . Mange moderne kommunikationskanaler har acceptable egenskaber, og ofte er det nok at kontrollere, om overførslen var vellykket, eller om der var nogen vanskeligheder; strukturen af fejlene og de specifikke placeringer af de forkerte symboler er overhovedet ikke af interesse for den modtagende part. Og under disse forhold viste algoritmer, der bruger kontrolsummer, sig at være en meget vellykket løsning. CRC er bedst egnet til sådanne opgaver: lave ressourceomkostninger, nem implementering og det allerede dannede matematiske apparat fra teorien om lineære cykliske koder sikrede dets enorme popularitet.
Selvom CRC-koden normalt kun bruges til fejldetektering, gør dens matematiske egenskaber det muligt at finde og rette en enkelt fejl i en blok af bit, hvis hver bit i den beskyttede blok (inklusive kontrolbittene) har sin egen unikke rest, når den er opdelt af generatorpolynomiet. For eksempel, hvis det genererende polynomium er irreducerbart, og længden af blokken ikke overstiger rækkefølgen af den genererede cykliske gruppe.
Generelt er kontrolsummen en værdi beregnet i henhold til et bestemt skema baseret på den kodede meddelelse. Kontroloplysningerne i systematisk kodning tildeles de overførte data. På den modtagende side kender abonnenten algoritmen til beregning af kontrolsummen: i overensstemmelse hermed har programmet mulighed for at kontrollere rigtigheden af de modtagne data.
Når pakker transmitteres over en netværkskanal, kan kildeinformationen blive forvrænget på grund af forskellige eksterne påvirkninger: elektrisk interferens, dårlige vejrforhold og mange andre. Essensen af teknikken er, at med gode egenskaber af kontrolsummen vil en fejl i meddelelsen i langt de fleste tilfælde føre til en ændring i dens kontrolsum. Hvis de oprindelige og beregnede beløb ikke er ens, tages der en beslutning om ugyldigheden af de modtagne data, og der kan anmodes om en gentransmission af pakken.
CRC-algoritmen er baseret på egenskaberne ved division med en rest af binære polynomier, det vil sige polynomier over et begrænset felt . CRC-værdien er i det væsentlige resten af at dividere polynomiet svarende til inputtet med et eller andet fast generatorpolynomium .
Hver endelig sekvens af bit er en-til-en forbundet med et binært polynomium , hvis koefficientsekvens er den oprindelige sekvens. For eksempel svarer bitsekvensen 1011010 til polynomiet:
Antallet af distinkte polynomier af grad mindre end er lig med , hvilket er det samme som antallet af alle binære sekvenser af længde .
Kontrolsumværdien i en algoritme med en genererende polynomiumgrad er defineret som en bitsekvens af længde , der repræsenterer polynomiet, hvilket resulterer i resten af at dividere polynomiet , der repræsenterer input-bitstrømmen, med polynomiet :
hvor
er et polynomium, der repræsenterer CRC-værdien; er et polynomium, hvis koefficienter repræsenterer inputdataene; er et genererende polynomium; er graden af det genererende polynomium.Multiplikation udføres ved at tildele nul bit til inputsekvensen, hvilket forbedrer kvaliteten af hashing for korte inputsekvenser.
Når man dividerer med en rest af forskellige oprindelige polynomier med et genererende polynomium af grad , kan man opnå forskellige rester fra division. er ofte et irreducerbart polynomium . Det vælges normalt i overensstemmelse med kravene til en hash-funktion i forbindelse med hver enkelt applikation.
Der er dog mange standardiserede polynomiegeneratorer, der har gode matematiske og korrelationsegenskaber (minimum antal kollisioner , nem beregning), hvoraf nogle er anført nedenfor.
En af hovedparametrene for CRC er det genererende polynomium.
En anden parameter forbundet med generatorpolynomiet er dens grad , som bestemmer antallet af bits , der bruges til at beregne CRC-værdien. I praksis er 8-, 16- og 32-bit ord de mest almindelige, hvilket er en konsekvens af de særlige kendetegn ved arkitekturen i moderne computerteknologi.
En anden parameter er ordets begyndelsesværdi (startværdi). Disse parametre definerer fuldstændigt den "traditionelle" CRC-beregningsalgoritme. Der er også modifikationer af algoritmen, for eksempel ved at bruge den omvendte rækkefølge af behandlingsbit.
Det første ord er taget fra filen - det kan være en bit (CRC-1), byte (CRC-8) eller et hvilket som helst andet element. Hvis den mest signifikante bit i ordet er "1", så flyttes ordet til venstre med en bit, efterfulgt af en XOR -operation med et genererende polynomium. Følgelig, hvis den mest signifikante bit i ordet er "0", så udføres XOR-operationen ikke efter skiftet . Efter skiftet går den mest signifikante bit tabt, og den næste bit fra filen indlæses i stedet for den mindst signifikante bit, og operationen gentages, indtil den sidste bit af filen er indlæst. Efter at have gennemgået hele filen, forbliver resten i ordet, som er kontrolsummen.
Mens cykliske redundanskoder er en del af standarderne, har dette udtryk ikke en generelt accepteret definition - forskellige forfatteres fortolkninger modsiger ofte hinanden [1] [5] .
Dette paradoks gælder også for valget af et generatorpolynomium: ofte er standardiserede polynomier ikke de mest effektive med hensyn til de statistiske egenskaber af deres tilsvarende kontrolredundanskode .
Mange udbredte polynomier er dog ikke de mest effektive af alle mulige. I 1993-2004 var en gruppe videnskabsmænd engageret i undersøgelsen af at generere polynomier med kapacitet op til 16 [1] 24 og 32 bit [6] [7] og fandt polynomier, der giver bedre ydeevne end standardiserede polynomier med hensyn til kodeafstand [7] . Et af resultaterne af denne undersøgelse har allerede fundet vej til iSCSI -protokollen .
Det mest populære og anbefalede IEEE polynomium for CRC-32 bruges i Ethernet , FDDI ; også dette polynomium er en Hamming-kodegenerator [8] . Brug af et andet polynomium - CRC-32C - giver dig mulighed for at opnå den samme ydeevne med længden af den originale besked fra 58 bit til 131 kbps, og i nogle områder af længden af inputmeddelelsen kan den være endnu højere, så det er også populær i dag [7] . For eksempel bruger ITU-T G.hn-standarden CRC-32C til at opdage fejl i nyttelasten.
Tabellen nedenfor viser de mest almindelige polynomier - CRC-generatorer. I praksis kan beregningen af CRC inkludere præ- og post-inversion, såvel som den omvendte rækkefølge af bitbehandling. Proprietære implementeringer af CRC bruger ikke-nul initiale registerværdier for at gøre koden sværere at parse.
Navn | Polynomium | Repræsentationer: [9] normal / omvendt / omvendt fra omvendt |
---|---|---|
CRC-1 | (bruges i hardwarefejlkontrol; også kendt som paritetsbit ) | 0x1 / 0x1 / 0x1 |
CRC-4-ITU | ( ITU G.704 [10] ) | 0x3 / 0xC / 0x9 |
CRC-5-EPC | ( Gen 2 RFID [11] ) | 0x09 / 0x12 / 0x14 |
CRC-5-ITU | ( ITU G.704 [12] ) | 0x15 / 0x15 / 0x1A |
CRC-5-USB | ( USB -token-pakker) | 0x05 / 0x14 / 0x12 |
CRC-6-ITU | ( ITU G.704 [13] ) | 0x03 / 0x30 / 0x21 |
CRC-7 | (telekommunikationssystemer, ITU-T G.707 [14] , ITU-T G.832 [15] , MMC , SD ) | 0x09 / 0x48 / 0x44 |
CRC-8- CCITT | ( ATM HEC ), ISDN Header Error Control and Cell Delineation ITU-T I.432.1 (02/99) | 0x07 / 0xE0 / 0x83 |
CRC-8- Dallas / Maxim | ( 1-leder bus ) | 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 | (telekommunikationssystemer [18] [19] ) | 0x80F / 0xF01 / 0xC07 |
CRC-15- CAN | 0x4599 / 0x4CD1 / 0x62CC | |
CRC-16- IBM | ( Bisync , Modbus , USB , ANSI X3.28 [20] , mange andre; også kendt som CRC-16 og CRC-16-ANSI ) | 0x8005 / 0xA001 / 0xC002 |
CRC-16-CCITT | ( X.25 , HDLC , XMODEM , Bluetooth , SD osv.) | 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 | Ikke CRC; se Fletchers kontrolsum | Brugt i 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 | Ikke CRC; se Adler-32 | Se Adler-32 |
CRC-32 - IEEE 802.3 | ( V.42 , MPEG-2 , PNG [22] , POSIX cksum ) | 0x04C11DB7 / 0xEDB88320 / 0x82608EDB [7] |
CRC-32C (Castagnoli) | ( iSCSI , G.hn nyttelast) | 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0 [7] |
CRC-32K (Koopman) | 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B [7] | |
CRC-32Q | (luftfart; AIXM [23] ) | 0x814141AB / 0xD5828281 / 0xC0A0A0D5 |
CRC-64-ISO | ( HDLC - ISO 3309 ) | 0x0000000000000001B / 0xD8000000000000000 / 0x8000000000000000D |
CRC-64- ECMA | [24] | 0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49 |
Eksisterende standarder CRC-128 (IEEE) og CRC-256 (IEEE) i øjeblikket[ hvornår? ] er blevet afløst af kryptografiske hash-funktioner .
En af de mest berømte er Ross N. Williams teknik [25] . Den bruger følgende muligheder:
Navn | Bredde | Poly | I det | RefIn | Ref ud | XorOut | Kontrollere |
---|---|---|---|---|---|---|---|
CRC-3/ROHC | 3 | 0x3 | 0x7 | rigtigt | rigtigt | 0x0 | 0x6 |
CRC-4/ITU | fire | 0x3 | 0x0 | rigtigt | rigtigt | 0x0 | 0x7 |
CRC-5/EPC | 5 | 0x9 | 0x9 | falsk | falsk | 0x0 | 0x0 |
CRC-5/ITU | 5 | 0x15 | 0x0 | rigtigt | rigtigt | 0x0 | 0x7 |
CRC-5/USB | 5 | 0x5 | 0x1F | rigtigt | rigtigt | 0x1F | 0x19 |
CRC-6/CDMA2000-A | 6 | 0x27 | 0x3F | falsk | falsk | 0x0 | 0xD |
CRC-6/CDMA2000-B | 6 | 0x7 | 0x3F | falsk | falsk | 0x0 | 0x3B |
CRC-6/DARC | 6 | 0x19 | 0x0 | rigtigt | rigtigt | 0x0 | 0x26 |
CRC-6/ITU | 6 | 0x3 | 0x0 | rigtigt | rigtigt | 0x0 | 0x6 |
CRC-7 | 7 | 0x9 | 0x0 | falsk | falsk | 0x0 | 0x75 |
CRC-7/ROHC | 7 | 0x4F | 0x7F | rigtigt | rigtigt | 0x0 | 0x53 |
CRC-8 | otte | 0x7 | 0x0 | falsk | falsk | 0x0 | 0xF4 |
CRC-8/CDMA2000 | otte | 0x9B | 0xFF | falsk | falsk | 0x0 | 0xDA |
CRC-8/DARC | otte | 0x39 | 0x0 | rigtigt | rigtigt | 0x0 | 0x15 |
CRC-8/DVB-S2 | otte | 0xD5 | 0x0 | falsk | falsk | 0x0 | 0xBC |
CRC-8/EBU | otte | 0x1D | 0xFF | rigtigt | rigtigt | 0x0 | 0x97 |
CRC-8/I-CODE | otte | 0x1D | 0xFD | falsk | falsk | 0x0 | 0x7E |
CRC-8/ITU | otte | 0x7 | 0x0 | falsk | falsk | 0x55 | 0xA1 |
CRC-8/MAXIM | otte | 0x31 | 0x0 | rigtigt | rigtigt | 0x0 | 0xA1 |
CRC-8/ROHC | otte | 0x7 | 0xFF | rigtigt | rigtigt | 0x0 | 0xD0 |
CRC-8/WCDMA | otte | 0x9B | 0x0 | rigtigt | rigtigt | 0x0 | 0x25 |
CRC-10 | ti | 0x233 | 0x0 | falsk | falsk | 0x0 | 0x199 |
CRC-10/CDMA2000 | ti | 0x3D9 | 0x3FF | falsk | falsk | 0x0 | 0x233 |
CRC-11 | elleve | 0x385 | 0x1A | falsk | falsk | 0x0 | 0x5A3 |
CRC-12/3GPP | 12 | 0x80F | 0x0 | falsk | rigtigt | 0x0 | 0xDAF |
CRC-12/CDMA2000 | 12 | 0xF13 | 0xFFF | falsk | falsk | 0x0 | 0xD4D |
CRC-12/DECT | 12 | 0x80F | 0x0 | falsk | falsk | 0x0 | 0xF5B |
CRC-13/BBC | 13 | 0x1CF5 | 0x0 | falsk | falsk | 0x0 | 0x4FA |
CRC-14/DARC | fjorten | 0x805 | 0x0 | rigtigt | rigtigt | 0x0 | 0x82D |
CRC-15 | femten | 0x4599 | 0x0 | falsk | falsk | 0x0 | 0x59E |
CRC-15/MPT1327 | femten | 0x6815 | 0x0 | falsk | falsk | 0x1 | 0x2566 |
CRC-16/ARC | 16 | 0x8005 | 0x0 | rigtigt | rigtigt | 0x0 | 0xBB3D |
CRC-16/AUG-CCITT | 16 | 0x1021 | 0x1D0F | falsk | falsk | 0x0 | 0xE5CC |
CRC-16/BUYPASS | 16 | 0x8005 | 0x0 | falsk | falsk | 0x0 | 0xFEE8 |
CRC-16/CCITT-FALSK | 16 | 0x1021 | 0xFFFF | falsk | falsk | 0x0 | 0x29B1 |
CRC-16/CDMA2000 | 16 | 0xC867 | 0xFFFF | falsk | falsk | 0x0 | 0x4C06 |
CRC-16/DDS-110 | 16 | 0x8005 | 0x800D | falsk | falsk | 0x0 | 0x9ECF |
CRC-16/DECT-R | 16 | 0x589 | 0x0 | falsk | falsk | 0x1 | 0x7E |
CRC-16/DECT-X | 16 | 0x589 | 0x0 | falsk | falsk | 0x0 | 0x7F |
CRC-16/DNP | 16 | 0x3D65 | 0x0 | rigtigt | rigtigt | 0xFFFF | 0xEA82 |
CRC-16/EN-13757 | 16 | 0x3D65 | 0x0 | falsk | falsk | 0xFFFF | 0xC2B7 |
CRC-16/GENIBUS | 16 | 0x1021 | 0xFFFF | falsk | falsk | 0xFFFF | 0xD64E |
CRC-16/MAXIM | 16 | 0x8005 | 0x0 | rigtigt | rigtigt | 0xFFFF | 0x44C2 |
CRC-16/MCRF4XX | 16 | 0x1021 | 0xFFFF | rigtigt | rigtigt | 0x0 | 0x6F91 |
CRC-16/RIELLO | 16 | 0x1021 | 0xB2AA | rigtigt | rigtigt | 0x0 | 0x63D0 |
CRC-16/T10-DIF | 16 | 0x8BB7 | 0x0 | falsk | falsk | 0x0 | 0xD0DB |
CRC-16/TELEDISK | 16 | 0xA097 | 0x0 | falsk | falsk | 0x0 | 0xFB3 |
CRC-16/TMS37157 | 16 | 0x1021 | 0x89EC | rigtigt | rigtigt | 0x0 | 0x26B1 |
CRC-16/USB | 16 | 0x8005 | 0xFFFF | rigtigt | rigtigt | 0xFFFF | 0xB4C8 |
CRC-A | 16 | 0x1021 | 0xC6C6 | rigtigt | rigtigt | 0x0 | 0xBF05 |
CRC-16/KERMIT | 16 | 0x1021 | 0x0 | rigtigt | rigtigt | 0x0 | 0x2189 |
CRC-16/MODBUS | 16 | 0x8005 | 0xFFFF | rigtigt | rigtigt | 0x0 | 0x4B37 |
CRC-16/X-25 | 16 | 0x1021 | 0xFFFF | rigtigt | rigtigt | 0xFFFF | 0x906E |
CRC-16/XMODEM | 16 | 0x1021 | 0x0 | falsk | falsk | 0x0 | 0x31C3 |
CRC-24 | 24 | 0x864CFB | 0xB704CE | falsk | falsk | 0x0 | 0x21CF02 |
CRC-24/FLEXRAY-A | 24 | 0x5D6DCB | 0xFEDCBA | falsk | falsk | 0x0 | 0x7979BD |
CRC-24/FLEXRAY-B | 24 | 0x5D6DCB | 0xABCDEF | falsk | falsk | 0x0 | 0x1F23B8 |
CRC-31/PHILIPS | 31 | 0x4C11DB7 | 0x7FFFFFFF | falsk | falsk | 0x7FFFFFFF | 0xCE9E46C |
CRC-32/ zlib | 32 | 0x4C11DB7 | 0xFFFFFFFF | rigtigt | rigtigt | 0xFFFFFFFF | 0xCBF43926 |
CRC-32/BZIP2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | falsk | falsk | 0xFFFFFFFF | 0xFC891918 |
CRC-32C | 32 | 0x1EDC6F41 | 0xFFFFFFFF | rigtigt | rigtigt | 0xFFFFFFFF | 0xE3069283 |
CRC-32D | 32 | 0xA833982B | 0xFFFFFFFF | rigtigt | rigtigt | 0xFFFFFFFF | 0x87315576 |
CRC-32/MPEG-2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | falsk | falsk | 0x0 | 0x376E6E7 |
CRC-32/POSIX | 32 | 0x4C11DB7 | 0x0 | falsk | falsk | 0xFFFFFFFF | 0x765E7680 |
CRC-32Q | 32 | 0x814141AB | 0x0 | falsk | falsk | 0x0 | 0x3010BF7F |
CRC-32/JAMCRC | 32 | 0x4C11DB7 | 0xFFFFFFFF | rigtigt | rigtigt | 0x0 | 0x340BC6D9 |
CRC-32/XFER | 32 | 0xAF | 0x0 | falsk | falsk | 0x0 | 0xBD0BE338 |
CRC-40/GSM | 40 | 0x4820009 | 0x0 | falsk | falsk | 0xFFFFFFFFFF | 0xD4164FC646 |
CRC-64 | 64 | 0x42F0E1EBA9EA3693 | 0x0 | falsk | falsk | 0x0 | 0x6C40DF5F0B497347 |
CRC-64/WE | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFF | falsk | falsk | 0xFFFFFFFFFFFFFF | 0x62EC59E3F1A4F00A |
CRC-64/XZ | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFF | rigtigt | rigtigt | 0xFFFFFFFFFFFFFF | 0x995DC9BBDF1939FA |
Hash funktioner | |
---|---|
generelle formål | |
Kryptografisk | |
Nøglegenereringsfunktioner | |
Tjek nummer ( sammenligning ) | |
Hashes |
|