CRC-számológép

A CRC-8/CCITT, CRC-16/CCITT-FALSE, CRC-16/MODBUS, CRC-32/ISO-HDLC (a zlib/PNG/gzip-féle), CRC-32C, CRC-32/BZIP2, CRC-32/MPEG-2, CRC-32/POSIX, cksum, CRC-64/XZ, CRC-64/ECMA-182, CRC-64/GO-ISO, CRC-64/REDIS vagy Adler-32 értéke számítható szövegre, hexadecimális bájtokra vagy teljes fájlokra — egyszerre több paraméterkészlettel, minden érték mellett kiírva a pontos paramétereket (poly, init, refin, refout, xorout), így az eltérés soha nem rejtély. A kriptográfiai kivonatokhoz (MD5/SHA-2/SHA-3/BLAKE2) a Kivonatgenerátor való.
Teljes egészében helyben fut — semmi nem töltődik fel. Fájlok legfeljebb 200 MB-ig.
Bemenet: Kimenet:
Algoritmusok:
A sorok „ALGORITMUS  érték” alakúak, amelyet behúzott paramétersor követ, így a másolt eredmény mindig megmondja, melyik paraméterkészlet hozta létre.
Melyik CRC-re van szükség?
Ha egy specifikáció csupán „CRC-32”-t említ, az majdnem mindig a CRC-32/ISO-HDLC-t jelenti — azt, amely a zlib, gzip, PNG, ZIP és Ethernet belsejében van. A CRC-32C (Castagnoli) a modern processzorokban hardveresen gyorsított változat, amelyet az iSCSI, ext4, btrfs és ZFS használ. A cksum a POSIX cksum paranccsal egyezik (az osztás előtt hozzáfűzi a fájlhosszt). A CRC-16/MODBUS a Modbus-eszközök RTU-keretének ellenőrző összege; a CRC-16/CCITT-FALSE gyakori chipkártyákban. A CRC-64/XZ az .xz archívumokban fordul elő; a Redis-fürt a CRC-64/REDIS-t használja a hash-slotokhoz. Az Adler-32 a zlib gyors alternatívája a CRC-32-vel szemben. Ha két eszköz nem ért egyet, a poly/init/xorout sorok összevetése segít — a paraméterkészlet, nem a név határozza meg az eredményt.
Önteszt
A 14 paraméterkészletre lefuttatja az oldal motorjait a közzétett ellenőrző értékekkel („123456789”), valamint hex-elemzési és tizedes/oktális megjelenítési ellenőrzésekkel. Semmi nem kerül elküldésre.
CRC — ciklikus redundanciaellenőrzés, a semmiből elmagyarázva
Egy mondatban: a CRC az adatot egy óriási bináris számként kezeli, elosztja egy rögzített „generátor” számmal kivonás helyett XOR-művelettel, és a maradékot jelenti — kompakt ujjlenyomat, amely drasztikusan változik, ha a bemenet akár egyetlen bitje megfordul, ezért hordoz CRC-t mindent a PNG-fájloktól a Modbus-vezetékekig.
Mi valójában a CRC

Az osztás képe. Az üzenet bájtjait egyetlen hosszú bináris számként kell felfogni. Egy osztó (a polinom) választandó, például a CRC-32-höz a 0x04C11DB7. Bináris hosszú osztás végezhető, ahol a „kivonás” az XOR művelet: valahányszor a futó maradék vezető bitje 1, XOR-ral hozzáadódik az osztó, majd balra léptetés, és az ismétlés. Miután az egész üzenet végigment, a regiszterben maradt érték a CRC. Nincsenek kulcsok, nincsenek táblázatok a definícióban — csak osztás maradékkal.

Az öt paraméter. Két rendszer is mondhatja, hogy „CRC-32”, és mégis eltérhet, mert a név önmagában nem rögzít semmit. A teljes recepthez öt érték kell: poly (az osztó), init (a regiszter kezdőértéke — csupa nulla esetén a vezető nulla bájtok eltűnnek, csupa egyes esetén nem), refin/refout (hogy minden bemeneti bájt — és a végső regiszter — bitjei megfordulnak-e, ami a soros hardver öröksége, amely a legkisebb helyértékű bitet küldte elsőként), és xorout (egy végső XOR-maszk, hogy a záró nullák sorozata is megváltoztassa az eredményt). Ezért az oldal minden eredmény mellett mind az öt értéket kiírja.

Miért észleli a hibákat. Jól megválasztott osztó mellett egy üzenet maradéka és ugyanazon üzenet maradéka néhány megfordított bittel nagy valószínűséggel eltér: egy jó CRC-32 elkapja az összes 1 bites és 2 bites hibát, az összes páratlan számú bithibát, és az összes legfeljebb 32 egymás utáni sérült bitből álló sávot — garantáltan, nem valószínűségi alapon. Ez a garancia a véletlen sérülésre vonatkozik, és ezért a CRC a megfelelő eszköz zajos vezetékekhez és hibás lemezekhez.

Mi nem a CRC

Nem kriptográfiai kivonat. Nincs titok és nincs egyirányúság: bárki, aki ismeri a paramétereket, milliszekundumok alatt bármilyen CRC-jű üzenetet hamisíthat, négy korrekciós bájt hozzáfűzésével. A CRC véletlen hibákat észlel, ellenségeket soha. Idegenektől származó, ellenőrzendő letöltéseknél az aláírások számítanak — helyette ez a Kivonatgenerátort (MD5/SHA/BLAKE2). Ez az oldal azt is elmagyarázza, miért vonták vissza az MD5-öt és a SHA-1-et ellenséges környezetben, míg a SHA-256 megáll.

Nem hibajavító kód. A CRC azt jelzi, hogy valami megváltozott, de azt nem, hogy mi változott. A hibák menet közbeni javítása olyan kódok feladata, mint a Reed–Solomon vagy a Hamming, amelyek szándékosan tárolnak olyan redundáns szerkezetet, amelyet a dekóder invertálni tud.

Nem tömörítés és nem titkosítás. A maradék a bemenet méretétől függetlenül néhány bájt, és ebből a bemenet nem állítható helyre — de a kriptográfiai kivonattal ellentétben ez csak azért van így, mert információ veszett el, nem azért, mert az invertálás nehéz.

Az oldal családjai

A CRC-32 négy rokona. Az oldal négy bejegyzése ugyanazt a 0x04C11DB7 polinomot osztja meg, mégis különböző értékeket ad: az ISO-HDLC (tükrözött, init/xorout csupa egyes) a zlib, gzip, PNG és ZIP „valódi” CRC-32-je; a BZIP2 ugyanaz a matematika tükrözetlenül; az MPEG-2 a BZIP2 végső XOR nélkül; a POSIX nullától indul, és a cksum parancs alapja (amely a fájlhosszt is hozzáfűzi az osztáshoz, így egy fájl cksum-ja és ugyanezen bájtok CRC-32/POSIX-e eltér). A CRC-32C (Castagnoli, 0x1EDC6F41 polinom) az ötödik testvér: másik polinom, amelyet jobb hibafelismerési teljesítményre választottak, és amelyet a modern x86- és ARM-processzorok egyetlen utasítással, memória-sebességgel számolnak.

A CRC-64 négyese. Az XZ a tükrözött alakú ECMA-182 polinomot használja, csupa egyes init- és xorout-értékkel; az ECMA-182 ellenben a nem tükrözött, nulla-init eredeti a DLT-1 szalagos szabványból; a GO-ISO a Go crc64.ISO függvénye, egy apró 0x1B polinommal, szintén tükrözve; a REDIS olyan polinomot használ, amelyet a jó lavinahatásért választottak a hash-slot kiosztásnál. A hatvannégy bit az a méret, ahol a CRC-k már hash-függvényként (csoportosításra) kezdenek működni, nem tiszta ellenőrző összegként.

Az Adler-32 a kívülálló: egyáltalán nem osztás. Összegzi a bájtokat (A, 1-től indulva), és összegzi ezeket az összegeket (B), mindkettő 65521 szerint vett maradékkal, majd összefűzi a két 16 bites összeget. Szoftverben gyorsabb, mint a CRC-32, és a zlib deflate-folyamokhoz használja — de rövid bemeneteknél (néhány száz bájt alatt) az összeg túl kevés információt hordoz, ezért vált a zlib kis blokkoknál vissza CRC-32-re.

A CRC-8 és a CRC-16 ott marad fenn, ahol a bájtok drágák: a CRC-8/CCITT (0x07 polinom) egyetlen fejlécbájtot véd SMBus- és mobilrádió-protokollokban; a CRC-16/CCITT-FALSE chipkártya-blokkokat véd; a CRC-16/MODBUS minden Modbus RTU-keret ellenőrző összege a gyártósorokon világszerte.

Hol él mindegyik
ParaméterkészletHol található
CRC-32/ISO-HDLCzlib, gzip, PNG, ZIP, Ethernet (FCS), számos archívumformátum
CRC-32CiSCSI, ext4, btrfs, ZFS, SSE4.2/ARMv8 hardveres CRC32C-utasítás
CRC-32/BZIP2.bz2 archívum-folyam
CRC-32/MPEG-2MPEG-2 transzportfolyamok
CRC-32/POSIX & cksumPOSIX cksum parancs kimenete (cksum file.txt)
CRC-16/MODBUSModbus RTU-keretek (ipari PLC-k, mérők, inverterek)
CRC-16/CCITT-FALSEchipkártyák, X.25-közeli kapcsolatok, néhány GPS-protokoll
CRC-8/CCITTSMBus (PEC-bájt), mobilrádió-fejlécek
CRC-64/XZ.xz tároló integritásellenőrzései
CRC-64/ECMA-182ECMA-182 / DLT-1 szalagos szabvány
CRC-64/GO-ISOGo szabványkönyvtár crc64.ISO
CRC-64/REDISRedis-fürt hash-slot-kiosztás
Adler-32zlib-folyamok (deflate), más gyors ellenőrző összeg kontextusok
A horgonytáblázat — check(„123456789”)

A CRC-katalógus szokása, hogy a 123456789 ASCII-sztring (9 bájt) eredményét közzéteszik. Az alábbi minden érték reprodukálható ezen az oldalon: a Szöveg mezőbe a 123456789 beírásával, az algoritmus bejelölésével és a Számítás gomb megnyomásával.

ParaméterkészletSzélességEllenőrző érték (hex)
CRC-8/CCITT80xf4
CRC-16/CCITT-FALSE160x29b1
CRC-16/MODBUS160x4b37
CRC-32/ISO-HDLC320xcbf43926
CRC-32C320xe3069283
CRC-32/BZIP2320xfc891918
CRC-32/MPEG-2320x0376e6e7
CRC-32/POSIX320x765e7680
cksum (POSIX command)320x377a6011
CRC-64/XZ640x995dc9bbdf1939fa
CRC-64/ECMA-182640x6c40df5f0b497347
CRC-64/GO-ISO640xb90956c775a41001
CRC-64/REDIS640xe9c6d914c4b8d9ca
Adler-32320x091e01de

Források: minden értéket független, bitenkénti referencia-implementáció ellenőriz, és ahol van, az algoritmust szállító rendszerkönyvtár is (zlib a CRC-32-höz és az Adler-32-höz; a többihez a Greg Cook CRC-katalógus).

Gyakori hibák
  • „CRC-32” paraméterek nélkül. Az ISO-HDLC, a BZIP2, az MPEG-2, a POSIX és a CRC-32C között öt különböző érték kering ugyanazon név alatt. Az eredménnyel mindig rögzíteni kell a poly/init/refin/refout/xorout paramétereket — ez az oldal kiírja őket.
  • Egy fájl CRC-32-jének összevetése a cksum kimenetével. Különböző algoritmusok: a cksum hozzáfűzi a hosszt, és más init-et használ. A számok nem fognak egyezni, és mindkettő „helyes”.
  • CRC-ben bízni a manipuláció ellen. Egyező CRC hamisítása tankönyvi feladat (az utolsó 4 bájt módosításával). Kulcsos MAC-et (HMAC) vagy aláírást kell használni, ha a másik fél rosszindulatú lehet.
  • Lavinahatásra számítani. A CRC lineáris: a kapcsolódó üzenetek kapcsolódó CRC-ket adnak. Zajra rendben van, kivonatolásra helytelen — ha csoportosításra van szükség, a CRC-64 vagy egy valódi kivonat biztonságosabb, mint a CRC-32.
  • Hex-szöveg vs. bájtok. A "123456789" sztring (9 ASCII-bájt, 31 32 33 34 35 36 37 38 39) és a 0x123456789 szám különböző bemenetek, eltérő CRC-vel. Ha a forrásadat valóban bináris, a Hex-bájtok fület kell használni.
GYIK

Miért nem egyezik a CRC-32 a ZIP-fájlban lévővel? A ZIP CRC-32-je ISO-HDLC a ki nem tömörített adatokon. Ellenőrizendő, hogy ugyanazok a bájtok legyenek hashelve (nem a tömörített adatfolyam), ugyanaz a mód (Szöveg vagy Hex), és ugyanaz a paraméterkészlet — az egyes eredmények alatt megjelenő paramétersor pedig azt teszi, hogy ez az ellenőrzés azonnal elvégezhető legyen.

Melyik a jobb, a CRC-32C vagy a CRC-32? A véletlen hibák felismeréséhez mindkettő elkap minden legfeljebb 32 bites sávot; a CRC-32C egyes hibamintázatokon jobban teljesít, és ehhez processzorutasítás is tartozik — gigabites sebességnél gyakorlatilag ingyenes. A CRC-32/ISO-HDLC azért marad fenn, mert a kompatibilitás miatt: harminc év archívumai ezt beszélik.

Erősebb-e a CRC-64, mint a CRC-32? Hosszabb sávokat (legfeljebb 64 bitig) észlel, és csoportosításra használva jóval ritkábban ütközik, de ugyanúgy hamisítható — a szélesség észlelési garanciákat ad, nem biztonságot.

Visszafejthető-e egy CRC, hogy felfedje a bemenetet? Nem — végtelen sok bemenet osztozik ugyanazon a CRC-n. Egy kriptográfiai kivonattal ellentétben azonban egy támadó tetszőleges CRC-jű bemenetet elő tud állítani, és ebben az értelemben egyáltalán nem egyirányú.