Rivit noudattavat muotoa “ALGORITMI arvo”, jota seuraa sisennetty parametririvi, joten kopioitu tulos kertoo aina, mikä parametrijoukko sen tuotti.
CRC — syklinen redundanssitarkistus, alusta asti selitettynä
Yhdessä lauseessa: CRC käsittelee datan yhtenä valtavana binääriluvuna, jakaa sen kiinteällä “generaattori”-luvulla käyttäen XOR:ia vähennyslaskun sijaan ja raportoi jakojäännöksen — tiiviin sormenjäljen, joka muuttuu rajusti jo yhden syötebitin kääntyessä, minkä vuoksi kaikki PNG-tiedostoista Modbus-johtoihin kantavat sellaisen.
Mikä CRC todellisuudessa on
Jakopiirros. Asettele tavut yhdeksi pitkäksi binääriluvuksi. Valitse jakaja — polynomi, esim. 0x04C11DB7 CRC-32:lle. Suorita binäärinen pitkä jako, jossa “vähennyslasku” on XOR-operaatio: aina kun juoksevan jäännöksen johtava bitti on 1, XOR-kytke jakaja, siirrä vasemmalle, toista. Kun koko viesti on kulkenut läpi, rekisteriin jäänyt on CRC. Ei avaimia eikä taulukoita määritelmässä — vain jako jäännöksellä.
Viisi parametria. Kaksi järjestelmää voivat molemmat sanoa “CRC-32” ja silti olla eri mieltä, koska pelkkä nimi ei määrää mitään. Täydellinen resepti tarvitsee viisi arvoa: poly (jakaja), init (mitä rekisteri aloittaa — kaikki nollat antavat alkunollatavujen kadota, kaikki ykköset eivät), refin/refout (käännetäänkö jokainen syötetavu — ja lopullinen rekisteri — bittijärjestyksessä, perintö sarjalaitteistoista, jotka lähettivät bitit vähiten merkitsevä ensin), ja xorout (lopullinen XOR-maski, jotta perässä oleva nollasarja muuttaa silti vastauksen). Tämä sivu tulostaa kaikki viisi jokaisen tuloksen viereen juuri tästä syystä.
Miksi se havaitsee virheitä. Hyvin valittu jakaja tekee viestin jäännöksen ja saman viestin jäännöksen, jossa muutama bitti on kääntynyt, eroavaksi ylivoimaisella todennäköisyydellä: hyvä CRC-32 tunnistaa kaikki 1- ja 2-bittiset virheet, kaikki pariton määrä bittivirheitä ja jokaisen enintään 32 peräkkäisen virheellisen bitin purskeen — taattuna, ei todennäköisyyksin. Tämä takuu koskee sattumanvaraista vaurioitumista, ja juuri se tekee CRC:stä oikean työkalun kohinaisille johdoille ja epävakaille levyille.
Mitä CRC ei ole
Ei kryptografinen tiiviste. Salaisuutta ei ole eikä yksisuuntaisuutta: kuka tahansa, joka tuntee parametrit, voi väärentää viestin millä tahansa CRC:llä millisekunneissa lisäämällä neljä korjaavaa tavua. CRC havaitsee sattumat, ei koskaan vastustajia. Latauksille, jotka tarkistat tuntemattomilta, allekirjoitukset ovat tärkeitä — katso sen sijaan Tiivistegeneraattori (MD5/SHA/BLAKE2). Sekin sivu selittää, miksi MD5 ja SHA-1 on vedetty pois vihamielisiin tilanteisiin, kun SHA-256 kestää.
Ei virheenkorjauskoodi. CRC kertoo, että jotain muuttui, ei mitä muuttui. Virheiden korjaaminen lennossa on koodien, kuten Reed–Solomon tai Hamming, tehtävä; ne tallentavat tarkoituksella ylimääräistä rakennetta, jonka dekooderi voi kääntää.
Ei pakkausta eikä salausta. Jäännös on muutama tavu syötteen koosta riippumatta, eikä siitä voi palauttaa syötettä — mutta toisin kuin kryptografisessa tiivisteessä, se johtuu vain siitä, että tietoa hävitettiin, ei siitä, että käänteinen laskeminen olisi vaikeaa.
Tämän sivun perheet
CRC-32-nelikko. Neljä tämän sivun merkintää jakavat polynomin 0x04C11DB7 ja tuottavat silti eri arvoja: ISO-HDLC (käännetty, alustus/xorout kaikki ykköset) on zlibin, gzipin, PNG:n ja ZIP:n “se” CRC-32; BZIP2 on sama matematiikka kääntämättömänä; MPEG-2 on BZIP2 ilman lopullista XOR:ia; POSIX alkaa nollasta ja on cksum-komennon perusta (joka lisäksi liittää tiedoston pituuden jakoon, joten tiedoston cksum ja saman tavujen CRC-32/POSIX eroavat). CRC-32C (Castagnoli, polynomi 0x1EDC6F41) on viides sisar: eri polynomi, valittu paremman virheidentunnistuksen takia, ja se, jonka nykyaikaiset x86- ja ARM-suorittimet voivat laskea muistin nopeudella yhdellä käskyllä.
CRC-64-nelikko. XZ käyttää ECMA-182-polynomia käännettynä kaikilla ykkösillä alustettuna ja xorout-maskilla; ECMA-182 itse on DLT-1-nauhastandardin kääntämätön nollalla alustettu alkuperäinen; GO-ISO on Go:n crc64.ISO, pieni poly 0x1B, yhä käännetty; REDIS käyttää polynomia, joka valittiin hyvän lavinavaikutuksen takia hash-lokeron osoituksessa. Kuusikymmentäneljä bittiä on koko, jossa CRC:itä aletaan käyttää hash-funktioina (lokerointiin) puhtaiden tarkistussummien sijaan.
Adler-32 on ulkopuolinen: se ei ole jakolasku lainkaan. Se summaa tavut (A, alkaen 1) ja summaa nämä summat (B), molemmat modulo 65521, ja yhdistää kaksi 16-bittistä summaa. Se on ohjelmistossa nopeampi kuin CRC-32, ja zlib käyttää sitä deflate-virroissa — mutta lyhyille syötteille (alle muutama sata tavua) summa kantaa liian vähän tietoa, minkä vuoksi zlib vaihtaa takaisin CRC-32:een pienille lohkoille.
CRC-8 ja CRC-16 säilyvät siellä, missä tavut ovat kalliita: CRC-8/CCITT (poly 0x07) suojaa yksittäisiä otsaketavuja SMBus- ja matkapuhelinradioprotokollissa; CRC-16/CCITT-FALSE suojaa älykorttilohkoja; CRC-16/MODBUS on jokaisen Modbus RTU -kehyksen tarkistussumma tehtaissa ympäri maailmaa.
Missä kukin elää
| Parametrijoukko | Löytyy |
| CRC-32/ISO-HDLC | zlib, gzip, PNG, ZIP, Ethernet (FCS), monet arkistomuodot |
| CRC-32C | iSCSI, ext4, btrfs, ZFS, SSE4.2/ARMv8 laitteisto-CRC32C-käsky |
| CRC-32/BZIP2 | .bz2-arkistovirta |
| CRC-32/MPEG-2 | MPEG-2-kuljetusvirrat |
| CRC-32/POSIX & cksum | POSIX cksum-komennon tuloste (cksum file.txt) |
| CRC-16/MODBUS | Modbus RTU -kehykset (teolliset PLC:t, mittarit, invertterit) |
| CRC-16/CCITT-FALSE | älykortit, X.25-tyyppiset linkit, joitakin GPS-protokollia |
| CRC-8/CCITT | SMBus (PEC-tavu), matkapuhelinradion otsakkeet |
| CRC-64/XZ | .xz-säilön eheystarkistukset |
| CRC-64/ECMA-182 | ECMA-182 / DLT-1-nauhastandardi |
| CRC-64/GO-ISO | Go:n vakiokirjasto crc64.ISO |
| CRC-64/REDIS | Redis-klusterin hash-lokeron osoitus |
| Adler-32 | zlib-virrat (deflate), muut nopeiden tarkistussummien yhteydet |
Ankkuritaulukko — check(“123456789”)
CRC-luettelon käytäntö on julkaista tulos ASCII-merkkijonolle 123456789 (9 tavua). Jokainen alla oleva arvo on toistettavissa tällä sivulla: kirjoita 123456789 Teksti-kenttään, valitse algoritmi ja napsauta Laske.
| Parametrijoukko | Leveys | Tarkistusarvo (heksa) |
| CRC-8/CCITT | 8 | 0xf4 |
| CRC-16/CCITT-FALSE | 16 | 0x29b1 |
| CRC-16/MODBUS | 16 | 0x4b37 |
| CRC-32/ISO-HDLC | 32 | 0xcbf43926 |
| CRC-32C | 32 | 0xe3069283 |
| CRC-32/BZIP2 | 32 | 0xfc891918 |
| CRC-32/MPEG-2 | 32 | 0x0376e6e7 |
| CRC-32/POSIX | 32 | 0x765e7680 |
| cksum (POSIX command) | 32 | 0x377a6011 |
| CRC-64/XZ | 64 | 0x995dc9bbdf1939fa |
| CRC-64/ECMA-182 | 64 | 0x6c40df5f0b497347 |
| CRC-64/GO-ISO | 64 | 0xb90956c775a41001 |
| CRC-64/REDIS | 64 | 0xe9c6d914c4b8d9ca |
| Adler-32 | 32 | 0x091e01de |
Lähteet: jokainen arvo tarkistettiin riippumattomalla bittitason viitetoteutuksella ja, missä sellainen on, algoritmin toimittavaa järjestelmäkirjastoa vastaan (zlib CRC-32:lle ja Adler-32:lle; Greg Cookin CRC-luettelo muille).
Yleisiä virheitä
- “CRC-32” ilman parametreja. ISO-HDLC:n, BZIP2:n, MPEG-2:n, POSIXin ja CRC-32C:n välillä kiertää viisi eri arvoa saman nimen alla. Tallenna aina poly/init/refin/refout/xorout tuloksen kanssa — tämä sivu tulostaa ne puolestasi.
- Tiedoston CRC-32:n vertaaminen sen
cksum-tulosteeseen. Eri algoritmit: cksum liittää pituuden ja käyttää eri alkuarvoa. Luvut eivät täsmää, ja molemmat ovat “oikein”.
- CRC:n luottaminen väärennyksiä vastaan. Vastaavan CRC:n väärentäminen on oppikirjaharjoitus (korjaa viimeiset 4 tavua). Käytä avainnettua MAC:ia (HMAC) tai allekirjoitusta, kun toinen osapuoli voi olla vihamielinen.
- Lavinavaikutuksen odottaminen. CRC on lineaarinen: toisiinsa liittyvät viestit antavat toisiinsa liittyvät CRC:t. Kohinalle sopii, tiivisteeseen ei — jos tarvitaan lokerointia, CRC-64 tai oikea tiiviste on turvallisempi kuin CRC-32.
- Heksateksti vs. tavut. Merkkijono
"123456789" (9 ASCII-tavua, 31 32 33 34 35 36 37 38 39) ja luku 0x123456789 ovat eri syötteitä eri CRC:illä. Käytä Heksatavut-välilehteä, kun lähdedata on todella binääristä.
UKK
Miksi CRC-32 ei täsmää ZIP-tiedoston CRC-32:n kanssa? ZIP:n CRC-32 on ISO-HDLC pakkaamattomalle datalle. Varmista, että tiivistit samat tavut (et pakattua virtaa), sama tila (Teksti vs. Heksa) ja sama parametrijoukko — jokaisen tuloksen alle tulostettu parametririvi on siellä, jotta tarkistus tapahtuu välittömästi.
Kumpi on parempi, CRC-32C vai CRC-32? Satunnaisten virheiden havaitsemiseen molemmat tunnistavat kaikki enintään 32 bitin purskeet; CRC-32C toimii paremmin joillakin virhekuvioilla ja on se, jolla on suorittimen käskyt — käytännössä ilmainen gigabitin nopeuksilla. Syy, miksi CRC-32/ISO-HDLC säilyy, on yhteensopivuus: kolmenkymmenen vuoden arkistot puhuvat sitä.
Onko CRC-64 vahvempi kuin CRC-32? Se havaitsee pidempiä purskeita (jopa 64 bittiä) ja törmää paljon harvemmin lokerointiin käytettynä, mutta se on yhtä helposti väärennettävissä — leveys tuo havaitsemistakuita, ei turvallisuutta.
Voiko CRC:n kääntää paljastaakseen syötteen? Ei — äärettömän monella syötteellä on sama CRC. Mutta toisin kuin kryptografisessa tiivisteessä, hyökkääjä voi rakentaa syötteen millä tahansa valitsemallaan CRC:llä, ja tässä mielessä se ei ole lainkaan yksisuuntainen.