Syklinen redundanssitarkistus _ _ , CRC [1] ) on algoritmi tarkistussumman löytämiseksi,suunniteltu tarkistamaan tietojen eheys [2] . CRC on käytännöllinen virheenkorjaavan koodauksen sovellus, joka perustuu syklisen koodin tiettyihin matemaattisiin ominaisuuksiin .
Syklisten koodien käsite on melko laaja [3] . Englanninkielisessä kirjallisuudessa CRC ymmärretään kahdella tavalla kontekstista riippuen: Cyclic Redundancy Code tai Cyclic Redundancy Check [4] . Ensimmäinen käsite tarkoittaa syklisten koodien matemaattista ilmiötä, toinen - tämän ilmiön erityistä soveltamista hash-funktiona .
Sykliset koodit eivät ole vain helppoja toteuttaa, vaan niillä on myös se etu, että ne sopivat purskevirheiden havaitsemiseen: jatkuvat virheellisten datamerkkien sekvenssit viesteissä. Tämä on tärkeää, koska purskevirheet ovat yleisiä lähetysvirheitä monissa viestintäkanavissa, mukaan lukien magneettiset ja optiset tallennuslaitteet. Tyypillisesti n-bittinen CRC, jota sovelletaan mielivaltaisen pituiseen datalohkoon ja jonka tarkistussumma välittömästi seuraa dataa, havaitsee minkä tahansa yksittäisen virhepurskeen, joka on enintään n bittiä, ja sen osuuden kaikista pidemmistä virhepurskeista. havaitsee on (1 − 2 −n ).
Ensimmäiset yritykset luoda koodeja, joissa on ylimääräistä tietoa, alkoivat kauan ennen nykyaikaisten tietokoneiden tuloa. Esimerkiksi 1960-luvulla Reed ja Solomon kehittivät tehokkaan koodaustekniikan - Reed-Solomon Coden . Sen käyttö ei tuolloin ollut mahdollista, koska ensimmäiset algoritmit eivät pystyneet suorittamaan dekoodaustoimintoa kohtuullisessa ajassa . Berlekampin perusteos , joka julkaistiin vuonna 1968, päätti tämän ongelman . Tätä tekniikkaa , jonka käytännön soveltamiseen Massey huomautti vuotta myöhemmin , käytetään edelleen digitaalisissa laitteissa, jotka vastaanottavat RS-koodattua dataa tähän päivään asti. Lisäksi: tämä järjestelmä sallii paitsi paikkojen määrittämisen, myös virheellisten koodisymbolien (useimmiten oktettien ) korjaamisen.
Mutta ei ole läheskään aina, että virheen korjaus vaaditaan koodista . Monilla nykyaikaisilla viestintäkanavilla on hyväksyttävät ominaisuudet, ja usein riittää, että tarkistetaan, onnistuiko siirto tai oliko vaikeuksia; virheiden rakenne ja virheellisten symbolien erityiset paikat eivät kiinnosta vastaanottavaa osapuolta ollenkaan. Ja näissä olosuhteissa tarkistussummia käyttävät algoritmit osoittautuivat erittäin onnistuneiksi ratkaisuiksi. CRC soveltuu parhaiten tällaisiin tehtäviin: alhaiset resurssikustannukset, helppokäyttöisyys ja lineaaristen syklisten koodien teoriasta jo muodostunut matemaattinen laitteisto varmistivat sen valtavan suosion.
Vaikka CRC-koodia käytetään yleensä vain virheiden havaitsemiseen, sen matemaattiset ominaisuudet mahdollistavat yksittäisen virheen löytämisen ja korjaamisen bittilohkossa, jos jokaisella suojatun lohkon bitillä (mukaan lukien tarkistusbitit) on oma ainutlaatuinen jäännös jaettuna. generaattoripolynomin mukaan. Esimerkiksi, jos generoiva polynomi on redusoitumaton ja lohkon pituus ei ylitä generoidun syklisen ryhmän järjestystä.
Yleensä tarkistussumma on arvo, joka lasketaan tietyn kaavion mukaan koodatun viestin perusteella. Tarkastustiedot systemaattisessa koodauksessa osoitetaan lähetetylle datalle. Vastaanottavalla puolella tilaaja tietää tarkistussumman laskemisalgoritmin: vastaavasti ohjelma pystyy tarkistamaan vastaanotettujen tietojen oikeellisuuden.
Kun paketteja lähetetään verkkokanavan kautta, lähdetiedot voivat vääristyä useiden ulkoisten vaikutusten vuoksi: sähköhäiriöt, huonot sääolosuhteet ja monet muut. Tekniikan ydin on, että tarkistussumman hyvillä ominaisuuksilla suurimmassa osassa tapauksista virhe viestissä johtaa sen tarkistussumman muutokseen. Jos alkuperäinen ja laskettu summa eivät ole samat, päätetään vastaanotetun tiedon pätemättömyydestä ja voidaan pyytää paketin uudelleenlähetystä.
CRC-algoritmi perustuu jaon ominaisuuksiin binääripolynomien jäännöksellä, eli äärellisen kentän polynomeilla . CRC - arvo on olennaisesti tuloa vastaavan polynomin jakamisen jäännös jollakin kiinteällä generaattoripolynomilla .
Jokainen äärellinen bittisekvenssi on yksi yhteen liitetty binääripolynomiin, jonka kerroinsekvenssi on alkuperäinen sekvenssi. Esimerkiksi bittisekvenssi 1011010 vastaa polynomia:
Erillisten polynomien lukumäärä, joiden aste on pienempi kuin on yhtä suuri kuin , mikä on sama kuin kaikkien pituisten binäärisekvenssien lukumäärä .
Algoritmin tarkistussumman arvo, jolla on generoiva polynomiaste, määritellään pituudeksi bittisekvenssiksi , joka edustaa polynomia , joka johtaa tulobittivirtaa edustavan polynomin jakamiseen polynomilla :
missä
on polynomi, joka edustaa CRC-arvoa; on polynomi, jonka kertoimet edustavat syöttödataa; on generoiva polynomi; on generoivan polynomin aste.Kertominen suoritetaan antamalla syöttösekvenssille nolla bittiä, mikä parantaa lyhyiden syöttösekvenssien hajautuslaatua.
Kun jaetaan erilaisten alkuperäisten polynomien jäännöksellä generoivalla astepolynomilla , jaosta voidaan saada erilaisia jäännöksiä. on usein redusoitumaton polynomi . Se valitaan yleensä tiivistefunktiolle asetettujen vaatimusten mukaisesti kunkin tietyn sovelluksen yhteydessä.
On kuitenkin monia standardoituja polynomigeneraattoreita, joilla on hyvät matemaattiset ja korrelaatioominaisuudet (vähimmäismäärä törmäyksiä , laskennan helppous), joista osa on lueteltu alla.
Yksi CRC:n pääparametreista on generoiva polynomi.
Toinen generaattoripolynomiin liittyvä parametri on sen aste , joka määrittää CRC-arvon laskemiseen käytettyjen bittien lukumäärän. Käytännössä yleisimpiä ovat 8-, 16- ja 32-bittiset sanat, mikä on seurausta modernin tietotekniikan arkkitehtuurin erityispiirteistä.
Toinen parametri on sanan aloitusarvo. Nämä parametrit määrittelevät täysin "perinteisen" CRC-laskentaalgoritmin. Algoritmiin on myös muunnelmia, esimerkiksi käyttämällä käänteistä käsittelybittien järjestystä.
Ensimmäinen sana on otettu tiedostosta - se voi olla bitti (CRC-1), tavu (CRC-8) tai mikä tahansa muu elementti. Jos sanan merkittävin bitti on "1", sanaa siirretään yhden bitin verran vasemmalle, minkä jälkeen suoritetaan XOR -operaatio generoivalla polynomilla. Vastaavasti, jos sanan merkittävin bitti on "0", XOR-toimintoa ei suoriteta siirron jälkeen. Siirron jälkeen merkittävin bitti katoaa ja seuraava bitti tiedostosta ladataan vähiten merkitsevän bitin tilalle, ja toimintoa toistetaan, kunnes tiedoston viimeinen bitti on ladattu. Kun koko tiedosto on käyty läpi, loppuosa jää sanaan, joka on tarkistussumma.
Vaikka sykliset redundanssikoodit ovat osa standardeja, tällä termillä ei ole yleisesti hyväksyttyä määritelmää - eri kirjoittajien tulkinnat ovat usein ristiriidassa keskenään [1] [5] .
Tämä paradoksi koskee myös generaattoripolynomin valintaa: usein standardoidut polynomit eivät ole tehokkaimpia niiden vastaavan tarkistusredundanssikoodin tilastollisten ominaisuuksien kannalta .
Monet laajalti käytetyt polynomit eivät kuitenkaan ole tehokkaimpia kaikista mahdollisista. Vuosina 1993-2004 ryhmä tutkijoita tutki polynomien generoimista, joiden kapasiteetti on enintään 16 [1] 24 ja 32 bittiä [6] [7] ja löysi polynomeja, jotka antavat paremman suorituskyvyn kuin standardoidut polynomit koodietäisyyden suhteen . [7] . Yksi tämän tutkimuksen tuloksista on jo löytänyt tiensä iSCSI - protokollaan .
Suosituinta ja suositeltua IEEE -polynomia CRC-32:lle käytetään Ethernetissä , FDDI :ssä ; myös tämä polynomi on Hamming -koodigeneraattori [8] . Toisen polynomin - CRC-32C - avulla voit saavuttaa saman suorituskyvyn alkuperäisen viestin pituudella 58 bitistä 131 kbps:iin, ja joillain syöttöviestin pituusalueilla se voi olla jopa suurempi, joten se on myös suosittu nykyään [7] . Esimerkiksi ITU-T G.hn -standardi käyttää CRC-32C:tä havaitsemaan virheet hyötykuormassa.
Alla olevassa taulukossa on lueteltu yleisimmät polynomit - CRC-generaattorit. Käytännössä CRC:n laskenta voi sisältää esi- ja jälkiinversion sekä käänteisen bittikäsittelyn järjestyksen. CRC:n omat toteutukset käyttävät nollasta poikkeavia alkurekisteriarvoja, mikä tekee koodista vaikeampaa jäsentää .
Nimi | Polynomi | Esitykset: [9] normaali / käänteinen / käänteinen käänteisestä |
---|---|---|
CRC-1 | (käytetään laitteistovirheiden tarkistuksessa; tunnetaan myös pariteettibittinä ) | 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 -tunnuspaketit) | 0x05 / 0x14 / 0x12 |
CRC-6-ITU | ( ITU G.704 [13] ) | 0x03 / 0x30 / 0x21 |
CRC-7 | (tietoliikennejärjestelmät, 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-johtiminen väylä ) | 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 | (televiestintäjärjestelmät [18] [19] ) | 0x80F / 0xF01 / 0xC07 |
CRC-15- CAN | 0x4599 / 0x4CD1 / 0x62CC | |
CRC-16- IBM | ( Bisync , Modbus , USB , ANSI X3.28 [20] , monet muut; tunnetaan myös nimellä CRC-16 ja CRC-16-ANSI ) | 0x8005 / 0xA001 / 0xC002 |
CRC-16-CCITT | ( X.25 , HDLC , XMODEM , Bluetooth , SD jne.) | 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 | Ei CRC; katso Fletcherin tarkistussumma | Käytetty Adler-32 A&B CRC: ssä |
CRC-24 | ( FlexRay [17] ) | 0x5D6DCB / 0xD3B6BA / 0xAEB6E5 |
CRC-24 Radix-64 | ( OpenPGP ) | 0x864CFB / 0xDF3261 / 0xC3267D |
CRC-30 | ( CDMA ) | 0x2030B9C7 / 0x38E74301 / 0x30185CE3 |
CRC-32-Adler | Ei CRC; katso Adler-32 | Katso 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 hyötykuorma) | 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0 [7] |
CRC-32K (Koopman) | 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B [7] | |
CRC-32Q | (ilmailu; AIXM [23] ) | 0x814141AB / 0xD5828281 / 0xC0A0A0D5 |
CRC-64-ISO | ( HDLC - ISO 3309 ) | 0x000000000000001B / 0xD800000000000000 / 0x8000000000000000D |
CRC-64- ECMA | [24] | 0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49 |
Nykyiset standardit CRC-128 (IEEE) ja CRC-256 (IEEE) tällä hetkellä[ milloin? ] on korvattu kryptografisilla hash-funktioilla .
Yksi tunnetuimmista on Ross N. Williamsin tekniikka [25] . Se käyttää seuraavia vaihtoehtoja:
Nimi | Leveys | Poly | Sen sisällä | RefIn | Ref Out | XorOut | Tarkistaa |
---|---|---|---|---|---|---|---|
CRC-3/ROHC | 3 | 0x3 | 0x7 | totta | totta | 0x0 | 0x6 |
CRC-4/ITU | neljä | 0x3 | 0x0 | totta | totta | 0x0 | 0x7 |
CRC-5/EPC | 5 | 0x9 | 0x9 | väärä | väärä | 0x0 | 0x0 |
CRC-5/ITU | 5 | 0x15 | 0x0 | totta | totta | 0x0 | 0x7 |
CRC-5/USB | 5 | 0x5 | 0x1F | totta | totta | 0x1F | 0x19 |
CRC-6/CDMA2000-A | 6 | 0x27 | 0x3F | väärä | väärä | 0x0 | 0xD |
CRC-6/CDMA2000-B | 6 | 0x7 | 0x3F | väärä | väärä | 0x0 | 0x3B |
CRC-6/DARC | 6 | 0x19 | 0x0 | totta | totta | 0x0 | 0x26 |
CRC-6/ITU | 6 | 0x3 | 0x0 | totta | totta | 0x0 | 0x6 |
CRC-7 | 7 | 0x9 | 0x0 | väärä | väärä | 0x0 | 0x75 |
CRC-7/ROHC | 7 | 0x4F | 0x7F | totta | totta | 0x0 | 0x53 |
CRC-8 | kahdeksan | 0x7 | 0x0 | väärä | väärä | 0x0 | 0xF4 |
CRC-8/CDMA2000 | kahdeksan | 0x9B | 0xFF | väärä | väärä | 0x0 | 0xDA |
CRC-8/DARC | kahdeksan | 0x39 | 0x0 | totta | totta | 0x0 | 0x15 |
CRC-8/DVB-S2 | kahdeksan | 0xD5 | 0x0 | väärä | väärä | 0x0 | 0xBC |
CRC-8/EBU | kahdeksan | 0x1D | 0xFF | totta | totta | 0x0 | 0x97 |
CRC-8/I-KOODI | kahdeksan | 0x1D | 0xFD | väärä | väärä | 0x0 | 0x7E |
CRC-8/ITU | kahdeksan | 0x7 | 0x0 | väärä | väärä | 0x55 | 0xA1 |
CRC-8/MAXIM | kahdeksan | 0x31 | 0x0 | totta | totta | 0x0 | 0xA1 |
CRC-8/ROHC | kahdeksan | 0x7 | 0xFF | totta | totta | 0x0 | 0xD0 |
CRC-8/WCDMA | kahdeksan | 0x9B | 0x0 | totta | totta | 0x0 | 0x25 |
CRC-10 | kymmenen | 0x233 | 0x0 | väärä | väärä | 0x0 | 0x199 |
CRC-10/CDMA2000 | kymmenen | 0x3D9 | 0x3FF | väärä | väärä | 0x0 | 0x233 |
CRC-11 | yksitoista | 0x385 | 0x1A | väärä | väärä | 0x0 | 0x5A3 |
CRC-12/3GPP | 12 | 0x80F | 0x0 | väärä | totta | 0x0 | 0xDAF |
CRC-12/CDMA2000 | 12 | 0xF13 | 0xFFF | väärä | väärä | 0x0 | 0xD4D |
CRC-12/DECT | 12 | 0x80F | 0x0 | väärä | väärä | 0x0 | 0xF5B |
CRC-13/BBC | 13 | 0x1CF5 | 0x0 | väärä | väärä | 0x0 | 0x4FA |
CRC-14/DARC | neljätoista | 0x805 | 0x0 | totta | totta | 0x0 | 0x82D |
CRC-15 | viisitoista | 0x4599 | 0x0 | väärä | väärä | 0x0 | 0x59E |
CRC-15/MPT1327 | viisitoista | 0x6815 | 0x0 | väärä | väärä | 0x1 | 0x2566 |
CRC-16/ARC | 16 | 0x8005 | 0x0 | totta | totta | 0x0 | 0xBB3D |
CRC-16/AUG-CCITT | 16 | 0x1021 | 0x1D0F | väärä | väärä | 0x0 | 0xE5CC |
CRC-16/BUYPASS | 16 | 0x8005 | 0x0 | väärä | väärä | 0x0 | 0xFEE8 |
CRC-16/CCITT-EPÄTOSI | 16 | 0x1021 | 0xFFFF | väärä | väärä | 0x0 | 0x29B1 |
CRC-16/CDMA2000 | 16 | 0xC867 | 0xFFFF | väärä | väärä | 0x0 | 0x4C06 |
CRC-16/DDS-110 | 16 | 0x8005 | 0x800D | väärä | väärä | 0x0 | 0x9ECF |
CRC-16/DECT-R | 16 | 0x589 | 0x0 | väärä | väärä | 0x1 | 0x7E |
CRC-16/DECT-X | 16 | 0x589 | 0x0 | väärä | väärä | 0x0 | 0x7F |
CRC-16/DNP | 16 | 0x3D65 | 0x0 | totta | totta | 0xFFFF | 0xEA82 |
CRC-16/FI-13757 | 16 | 0x3D65 | 0x0 | väärä | väärä | 0xFFFF | 0xC2B7 |
CRC-16/GENIBUS | 16 | 0x1021 | 0xFFFF | väärä | väärä | 0xFFFF | 0xD64E |
CRC-16/MAXIM | 16 | 0x8005 | 0x0 | totta | totta | 0xFFFF | 0x44C2 |
CRC-16/MCRF4XX | 16 | 0x1021 | 0xFFFF | totta | totta | 0x0 | 0x6F91 |
CRC-16/RIELLO | 16 | 0x1021 | 0xB2AA | totta | totta | 0x0 | 0x63D0 |
CRC-16/T10-DIF | 16 | 0x8BB7 | 0x0 | väärä | väärä | 0x0 | 0xD0DB |
CRC-16/TELEDISK | 16 | 0xA097 | 0x0 | väärä | väärä | 0x0 | 0xFB3 |
CRC-16/TMS37157 | 16 | 0x1021 | 0x89EC | totta | totta | 0x0 | 0x26B1 |
CRC-16/USB | 16 | 0x8005 | 0xFFFF | totta | totta | 0xFFFF | 0xB4C8 |
CRC-A | 16 | 0x1021 | 0xC6C6 | totta | totta | 0x0 | 0xBF05 |
CRC-16/KERMIT | 16 | 0x1021 | 0x0 | totta | totta | 0x0 | 0x2189 |
CRC-16/MODBUS | 16 | 0x8005 | 0xFFFF | totta | totta | 0x0 | 0x4B37 |
CRC-16/X-25 | 16 | 0x1021 | 0xFFFF | totta | totta | 0xFFFF | 0x906E |
CRC-16/XMODEM | 16 | 0x1021 | 0x0 | väärä | väärä | 0x0 | 0x31C3 |
CRC-24 | 24 | 0x864CFB | 0xB704CE | väärä | väärä | 0x0 | 0x21CF02 |
CRC-24/FLEXRAY-A | 24 | 0x5D6DCB | 0xFEDCBA | väärä | väärä | 0x0 | 0x7979BD |
CRC-24/FLEXRAY-B | 24 | 0x5D6DCB | 0xABCDEF | väärä | väärä | 0x0 | 0x1F23B8 |
CRC-31/PHILIPS | 31 | 0x4C11DB7 | 0x7FFFFFFF | väärä | väärä | 0x7FFFFFFF | 0xCE9E46C |
CRC-32/ zlib | 32 | 0x4C11DB7 | 0xFFFFFFFF | totta | totta | 0xFFFFFFFF | 0xCBF43926 |
CRC-32/BZIP2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | väärä | väärä | 0xFFFFFFFF | 0xFC891918 |
CRC-32C | 32 | 0x1EDC6F41 | 0xFFFFFFFF | totta | totta | 0xFFFFFFFF | 0xE3069283 |
CRC-32D | 32 | 0xA833982B | 0xFFFFFFFF | totta | totta | 0xFFFFFFFF | 0x87315576 |
CRC-32/MPEG-2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | väärä | väärä | 0x0 | 0x376E6E7 |
CRC-32/POSIX | 32 | 0x4C11DB7 | 0x0 | väärä | väärä | 0xFFFFFFFF | 0x765E7680 |
CRC-32Q | 32 | 0x814141AB | 0x0 | väärä | väärä | 0x0 | 0x3010BF7F |
CRC-32/JAMCRC | 32 | 0x4C11DB7 | 0xFFFFFFFF | totta | totta | 0x0 | 0x340BC6D9 |
CRC-32/XFER | 32 | 0xAF | 0x0 | väärä | väärä | 0x0 | 0xBD0BE338 |
CRC-40/GSM | 40 | 0x4820009 | 0x0 | väärä | väärä | 0xFFFFFFFFFF | 0xD4164FC646 |
CRC-64 | 64 | 0x42F0E1EBA9EA3693 | 0x0 | väärä | väärä | 0x0 | 0x6C40DF5F0B497347 |
CRC-64/WE | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFFFF | väärä | väärä | 0xFFFFFFFFFFFFFFFF | 0x62EC59E3F1A4F00A |
CRC-64/XZ | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFFFF | totta | totta | 0xFFFFFFFFFFFFFFFF | 0x995DC9BBDF1939FA |
Hash-funktiot | |
---|---|
yleinen tarkoitus | |
Kryptografinen | |
Avainten luontitoiminnot | |
Tarkista numero ( vertailu ) | |
Hashes |
|