Ciklikus redundancia ellenőrzés _ , a CRC [1] ) egy algoritmus azadatok integritásának ellenőrzésére szolgáló ellenőrző összeg megtalálására [2] . A CRC a hibajavító kódolás gyakorlati alkalmazása, amely egy ciklikus kód bizonyos matematikai tulajdonságain.
A ciklikus kódok fogalma meglehetősen tág [3] . Az angol szakirodalomban a CRC kétféleképpen értendő, a szövegkörnyezettől függően: ciklikus redundáns kód vagy ciklikus redundáns ellenőrzés [4] . Az első fogalom a ciklikus kódok matematikai jelenségét jelenti, a második - ennek a jelenségnek a konkrét alkalmazását hash függvényként .
A ciklikus kódok nem csak könnyen megvalósíthatók, de megvan az az előnyük is, hogy alkalmasak a burst hibák észlelésére: a hibás adatkarakterek folyamatos sorozata az üzenetekben. Ez azért fontos, mert a burst hibák gyakori átviteli hibák számos kommunikációs csatornában, beleértve a mágneses és optikai tárolóeszközöket is. Általában egy n-bites CRC, amelyet egy tetszőleges hosszúságú adatblokkra alkalmaznak, és közvetlenül az adatokat követi az ellenőrző összeg, minden n bitnél nem hosszabb hibasorozatot észlel, és az összes hosszabb hibalöket arányát. érzékeli (1 − 2 −n ).
Az első kísérletek redundáns információkkal rendelkező kódok létrehozására jóval a modern számítógépek megjelenése előtt kezdődtek. Például az 1960-as években Reed és Solomon kifejlesztett egy hatékony kódolási technikát - a Reed-Solomon kódot . Használata ekkor még nem volt lehetséges, mivel az első algoritmusok nem tudták ésszerű időn belül végrehajtani a dekódolási műveletet. Berlekamp 1968 -ban megjelent alapvető munkája véget vetett ennek a kérdésnek . Ezt a technikát , amelynek gyakorlati alkalmazására Massey egy évvel később rámutatott , a mai napig használják az RS-kódolt adatokat fogadó digitális eszközökben. Sőt: ez a rendszer nem csak a pozíciók meghatározását teszi lehetővé, hanem a hibás kódszimbólumok (leggyakrabban oktett ) kijavítását is.
De nem mindig van szükség hibajavításra a kódból . Számos modern kommunikációs csatorna rendelkezik elfogadható tulajdonságokkal, és gyakran elegendő ellenőrizni, hogy az átvitel sikeres volt-e, vagy voltak- e nehézségek; a hibák szerkezete és a helytelen szimbólumok konkrét elhelyezkedése egyáltalán nem érdekli a fogadó felet. És ilyen körülmények között az ellenőrző összegeket használó algoritmusok nagyon sikeres megoldásnak bizonyultak. Az ilyen feladatokra a CRC a legalkalmasabb: az alacsony erőforrás-költségek, a könnyű implementáció és a lineáris ciklikus kódok elméletéből már kialakult matematikai apparátus biztosította óriási népszerűségét.
Bár a CRC kódot általában csak hibadetektálásra használják, matematikai tulajdonságai lehetővé teszik egyetlen hiba megtalálását és kijavítását egy bitblokkban, ha a védett blokk minden bitje (beleértve az ellenőrző biteket is) felosztáskor saját egyedi maradékot tartalmaz. a generátor polinom által. Például, ha a generáló polinom irreducibilis, és a blokk hossza nem haladja meg a generált ciklikus csoport sorrendjét.
Általában az ellenőrző összeg egy bizonyos séma szerint kiszámított érték a kódolt üzenet alapján. A szisztematikus kódolásban az ellenőrző információk hozzá vannak rendelve a továbbított adatokhoz. A fogadó oldalon az előfizető ismeri az ellenőrző összeg kiszámításának algoritmusát: ennek megfelelően a program képes ellenőrizni a kapott adatok helyességét.
Amikor a csomagokat hálózati csatornán továbbítják, a forrásinformációk torzulhatnak különböző külső hatások miatt: elektromos interferencia, rossz időjárási viszonyok és sok más. A technika lényege, hogy az ellenőrzőösszeg jó tulajdonságai mellett az esetek túlnyomó többségében az üzenet hibája az ellenőrzőösszeg megváltozásához vezet. Ha az eredeti és a számított összeg nem egyezik, akkor döntés születik a kapott adatok érvénytelenségéről, és kérhető a csomag újraküldése.
A CRC algoritmus a bináris polinomok maradékával, azaz véges mező feletti polinomokkal való osztás tulajdonságain alapul . A CRC érték lényegében a bemenetnek megfelelő polinom valamilyen rögzített generátorpolinommal való osztásának maradéka .
Minden véges bitsorozat egy az egyhez van társítva egy bináris polinomhoz, amelynek együtthatósorozata az eredeti sorozat. Például az 1011010 bitsorozat a polinomnak felel meg:
A -nál kisebb fokú különböző polinomok száma egyenlő -vel , ami megegyezik az összes hosszúságú bináris sorozat számával .
Az ellenőrzőösszeg értéke egy polinomot generáló algoritmusban egy hosszúságú bitsorozatként van definiálva, amely azt a polinomot reprezentálja, amely a bemeneti bitfolyamot képviselő polinomnak a polinommal való osztásának maradékát eredményezi :
ahol
a CRC értéket képviselő polinom; egy polinom, amelynek együtthatói a bemeneti adatokat reprezentálják; egy generáló polinom; a generáló polinom foka.A szorzás úgy történik, hogy a bemeneti sorozathoz nulla bitet rendelünk, ami javítja a rövid bemeneti sorozatok kivonatolási minőségét.
Ha különböző eredeti polinomok maradékával osztunk egy fokú generáló polinommal, az osztásból különböző maradékokat kaphatunk . gyakran egy irreducibilis polinom . Általában az egyes alkalmazások kontextusában a hash függvény követelményeinek megfelelően választják ki.
Azonban számos szabványos polinomgenerátor létezik, amelyek jó matematikai és korrelációs tulajdonságokkal rendelkeznek (minimális ütközések száma , könnyű számítás), amelyek közül néhányat az alábbiakban sorolunk fel.
A CRC egyik fő paramétere a generáló polinom.
A generátor polinomhoz kapcsolódó másik paraméter a foka , amely meghatározza a CRC érték kiszámításához használt bitek számát. A gyakorlatban a 8, 16 és 32 bites szavak a legelterjedtebbek, ami a modern számítástechnika architektúrájának sajátosságainak következménye.
Egy másik paraméter a szó kezdő (kezdő) értéke. Ezek a paraméterek teljesen meghatározzák a "hagyományos" CRC számítási algoritmust. Vannak az algoritmus módosításai is, például a feldolgozási bitek fordított sorrendjének használatával.
Az első szó a fájlból származik - lehet bit (CRC-1), bájt (CRC-8) vagy bármilyen más elem. Ha a szó legjelentősebb bitje "1", akkor a szó egy bittel balra tolódik, majd egy XOR művelet következik egy generáló polinommal. Ennek megfelelően, ha a szó legjelentősebb bitje "0", akkor az XOR művelet nem kerül végrehajtásra a shift után. Az eltolás után a legjelentősebb bit elveszik, és a fájl következő bitje töltődik be a legkisebb jelentőségű bit helyére, és a művelet addig ismétlődik, amíg a fájl utolsó bitje be nem töltődik. Miután végigment a teljes fájlon, a maradék a szóban marad, ami az ellenőrző összeg.
Míg a ciklikus redundancia kódok a szabványok részét képezik, ennek a kifejezésnek nincs általánosan elfogadott definíciója – a különböző szerzők értelmezései gyakran ellentmondanak egymásnak [1] [5] .
Ez a paradoxon vonatkozik a generátorpolinom kiválasztására is: gyakran a szabványosított polinomok nem a leghatékonyabbak a megfelelő ellenőrzési redundancia kódjuk statisztikai tulajdonságait tekintve .
Azonban sok széles körben használt polinom nem a leghatékonyabb az összes lehetséges közül. 1993-2004-ben tudósok egy csoportja 16 [1] 24 és 32 bites kapacitású polinomok generálásával foglalkozott [6] [7] , és olyan polinomokat talált, amelyek kódtávolság tekintetében jobb teljesítményt nyújtanak, mint a szabványos polinomok. [7] . A tanulmány egyik eredménye már bekerült az iSCSI protokollba .
A legnépszerűbb és legajánlottabb IEEE -polinom a CRC-32-hez az Ethernetben , FDDI -ben használatos ; ez a polinom is egy Hamming-kód generátor [8] . Egy másik polinom - CRC-32C - használatával ugyanazt a teljesítményt érheti el az eredeti üzenet 58 bittől 131 kbps-ig terjedő hosszával, és a bemeneti üzenet hosszának egyes tartományaiban ez még magasabb is lehet, így ma népszerű [7] . Például az ITU-T G.hn szabvány a CRC-32C-t használja a rakomány hibáinak észlelésére.
Az alábbi táblázat felsorolja a leggyakoribb polinomokat - CRC generátorokat. A gyakorlatban a CRC számítása magában foglalhatja az elő- és utóinverziót, valamint a bitfeldolgozás fordított sorrendjét. A CRC saját megvalósításai nem nulla kezdeti regiszterértékeket használnak, hogy megnehezítsék a kód elemzését.
Név | Polinom | Ábrázolások: [9] normál / fordított / fordítottból fordított |
---|---|---|
CRC-1 | (hardverhiba-ellenőrzésben használatos; paritásbitként is ismert ) | 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 csomagok) | 0x05 / 0x14 / 0x12 |
CRC-6-ITU | ( ITU G.704 [13] ) | 0x03 / 0x30 / 0x21 |
CRC-7 | (távközlési rendszerek, ITU-T G.707 [14] , ITU-T G.832 [15] , MMC , SD ) | 0x09 / 0x48 / 0x44 |
CRC-8- CCITT | ( ATM HEC ), ISDN fejléc-hibakezelés és cellahatárolás ITU-T I.432.1 (02/99) | 0x07 / 0xE0 / 0x83 |
CRC-8- Dallas / Maxim | ( 1 vezetékes busz ) | 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 | (távközlési rendszerek [18] [19] ) | 0x80F / 0xF01 / 0xC07 |
CRC-15- CAN | 0x4599 / 0x4CD1 / 0x62CC | |
CRC-16- IBM | ( Bisync , Modbus , USB , ANSI X3.28 [20] , sok más ; más néven CRC-16 és CRC-16-ANSI ) | 0x8005 / 0xA001 / 0xC002 |
CRC-16-CCITT | ( X.25 , HDLC , XMODEM , Bluetooth , SD stb.) | 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 | Nem CRC; lásd Fletcher ellenőrző összegét | Adler-32 A&B CRC - ben használt |
CRC-24 | ( FlexRay [17] ) | 0x5D6DCB / 0xD3B6BA / 0xAEB6E5 |
CRC-24 Radix-64 | ( OpenPGP ) | 0x864CFB / 0xDF3261 / 0xC3267D |
CRC-30 | ( CDMA ) | 0x2030B9C7 / 0x38E74301 / 0x30185CE3 |
CRC-32-Adler | Nem CRC; lásd Adler-32 | Lásd: 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 hasznos terhelés) | 0x1EDC6F41 / 0x82F63B78 / 0x8F6E37A0 [7] |
CRC-32K (Koopman) | 0x741B8CD7 / 0xEB31D82E / 0xBA0DC66B [7] | |
CRC-32Q | (repülés; AIXM [23] ) | 0x814141AB / 0xD5828281 / 0xC0A0A0D5 |
CRC-64-ISO | ( HDLC - ISO 3309 ) | 0x000000000000001B / 0xD800000000000000 / 0x8000000000000000D |
CRC-64- ECMA | [24] | 0x42F0E1EBA9EA3693 / 0xC96C5795D7870F42 / 0xA17870F5D4F51B49 |
Jelenleg a CRC-128 (IEEE) és a CRC-256 (IEEE) szabványok[ mikor? ] kriptográfiai hash függvények váltották fel .
Az egyik leghíresebb a Ross N. Williams technika [25] . A következő opciókat használja:
Név | Szélesség | Poly | Benne | RefIn | RefOut | XorOut | Jelölje be |
---|---|---|---|---|---|---|---|
CRC-3/ROHC | 3 | 0x3 | 0x7 | igaz | igaz | 0x0 | 0x6 |
CRC-4/ITU | négy | 0x3 | 0x0 | igaz | igaz | 0x0 | 0x7 |
CRC-5/EPC | 5 | 0x9 | 0x9 | hamis | hamis | 0x0 | 0x0 |
CRC-5/ITU | 5 | 0x15 | 0x0 | igaz | igaz | 0x0 | 0x7 |
CRC-5/USB | 5 | 0x5 | 0x1F | igaz | igaz | 0x1F | 0x19 |
CRC-6/CDMA2000-A | 6 | 0x27 | 0x3F | hamis | hamis | 0x0 | 0xD |
CRC-6/CDMA2000-B | 6 | 0x7 | 0x3F | hamis | hamis | 0x0 | 0x3B |
CRC-6/DARC | 6 | 0x19 | 0x0 | igaz | igaz | 0x0 | 0x26 |
CRC-6/ITU | 6 | 0x3 | 0x0 | igaz | igaz | 0x0 | 0x6 |
CRC-7 | 7 | 0x9 | 0x0 | hamis | hamis | 0x0 | 0x75 |
CRC-7/ROHC | 7 | 0x4F | 0x7F | igaz | igaz | 0x0 | 0x53 |
CRC-8 | nyolc | 0x7 | 0x0 | hamis | hamis | 0x0 | 0xF4 |
CRC-8/CDMA2000 | nyolc | 0x9B | 0xFF | hamis | hamis | 0x0 | 0xDA |
CRC-8/DARC | nyolc | 0x39 | 0x0 | igaz | igaz | 0x0 | 0x15 |
CRC-8/DVB-S2 | nyolc | 0xD5 | 0x0 | hamis | hamis | 0x0 | 0xBC |
CRC-8/EBU | nyolc | 0x1D | 0xFF | igaz | igaz | 0x0 | 0x97 |
CRC-8/I-CODE | nyolc | 0x1D | 0xFD | hamis | hamis | 0x0 | 0x7E |
CRC-8/ITU | nyolc | 0x7 | 0x0 | hamis | hamis | 0x55 | 0xA1 |
CRC-8/MAXIM | nyolc | 0x31 | 0x0 | igaz | igaz | 0x0 | 0xA1 |
CRC-8/ROHC | nyolc | 0x7 | 0xFF | igaz | igaz | 0x0 | 0xD0 |
CRC-8/WCDMA | nyolc | 0x9B | 0x0 | igaz | igaz | 0x0 | 0x25 |
CRC-10 | tíz | 0x233 | 0x0 | hamis | hamis | 0x0 | 0x199 |
CRC-10/CDMA2000 | tíz | 0x3D9 | 0x3FF | hamis | hamis | 0x0 | 0x233 |
CRC-11 | tizenegy | 0x385 | 0x1A | hamis | hamis | 0x0 | 0x5A3 |
CRC-12/3GPP | 12 | 0x80F | 0x0 | hamis | igaz | 0x0 | 0xDAF |
CRC-12/CDMA2000 | 12 | 0xF13 | 0xFFF | hamis | hamis | 0x0 | 0xD4D |
CRC-12/DECT | 12 | 0x80F | 0x0 | hamis | hamis | 0x0 | 0xF5B |
CRC-13/BBC | 13 | 0x1CF5 | 0x0 | hamis | hamis | 0x0 | 0x4FA |
CRC-14/DARC | tizennégy | 0x805 | 0x0 | igaz | igaz | 0x0 | 0x82D |
CRC-15 | tizenöt | 0x4599 | 0x0 | hamis | hamis | 0x0 | 0x59E |
CRC-15/MPT1327 | tizenöt | 0x6815 | 0x0 | hamis | hamis | 0x1 | 0x2566 |
CRC-16/ARC | 16 | 0x8005 | 0x0 | igaz | igaz | 0x0 | 0xBB3D |
CRC-16/AUG-CCITT | 16 | 0x1021 | 0x1D0F | hamis | hamis | 0x0 | 0xE5CC |
CRC-16/BUYPASS | 16 | 0x8005 | 0x0 | hamis | hamis | 0x0 | 0xFEE8 |
CRC-16/CCITT-HAMIS | 16 | 0x1021 | 0xFFFF | hamis | hamis | 0x0 | 0x29B1 |
CRC-16/CDMA2000 | 16 | 0xC867 | 0xFFFF | hamis | hamis | 0x0 | 0x4C06 |
CRC-16/DDS-110 | 16 | 0x8005 | 0x800D | hamis | hamis | 0x0 | 0x9ECF |
CRC-16/DECT-R | 16 | 0x589 | 0x0 | hamis | hamis | 0x1 | 0x7E |
CRC-16/DECT-X | 16 | 0x589 | 0x0 | hamis | hamis | 0x0 | 0x7F |
CRC-16/DNP | 16 | 0x3D65 | 0x0 | igaz | igaz | 0xFFFF | 0xEA82 |
CRC-16/EN-13757 | 16 | 0x3D65 | 0x0 | hamis | hamis | 0xFFFF | 0xC2B7 |
CRC-16/GENIBUS | 16 | 0x1021 | 0xFFFF | hamis | hamis | 0xFFFF | 0xD64E |
CRC-16/MAXIM | 16 | 0x8005 | 0x0 | igaz | igaz | 0xFFFF | 0x44C2 |
CRC-16/MCRF4XX | 16 | 0x1021 | 0xFFFF | igaz | igaz | 0x0 | 0x6F91 |
CRC-16/RIELLO | 16 | 0x1021 | 0xB2AA | igaz | igaz | 0x0 | 0x63D0 |
CRC-16/T10-DIF | 16 | 0x8BB7 | 0x0 | hamis | hamis | 0x0 | 0xD0DB |
CRC-16/TELEDISK | 16 | 0xA097 | 0x0 | hamis | hamis | 0x0 | 0xFB3 |
CRC-16/TMS37157 | 16 | 0x1021 | 0x89EC | igaz | igaz | 0x0 | 0x26B1 |
CRC-16/USB | 16 | 0x8005 | 0xFFFF | igaz | igaz | 0xFFFF | 0xB4C8 |
CRC-A | 16 | 0x1021 | 0xC6C6 | igaz | igaz | 0x0 | 0xBF05 |
CRC-16/KERMIT | 16 | 0x1021 | 0x0 | igaz | igaz | 0x0 | 0x2189 |
CRC-16/MODBUS | 16 | 0x8005 | 0xFFFF | igaz | igaz | 0x0 | 0x4B37 |
CRC-16/X-25 | 16 | 0x1021 | 0xFFFF | igaz | igaz | 0xFFFF | 0x906E |
CRC-16/XMODEM | 16 | 0x1021 | 0x0 | hamis | hamis | 0x0 | 0x31C3 |
CRC-24 | 24 | 0x864CFB | 0xB704CE | hamis | hamis | 0x0 | 0x21CF02 |
CRC-24/FLEXRAY-A | 24 | 0x5D6DCB | 0xFEDCBA | hamis | hamis | 0x0 | 0x7979BD |
CRC-24/FLEXRAY-B | 24 | 0x5D6DCB | 0xABCDEF | hamis | hamis | 0x0 | 0x1F23B8 |
CRC-31/PHILIPS | 31 | 0x4C11DB7 | 0x7FFFFFFF | hamis | hamis | 0x7FFFFFFF | 0xCE9E46C |
CRC-32/ zlib | 32 | 0x4C11DB7 | 0xFFFFFFFF | igaz | igaz | 0xFFFFFFFF | 0xCBF43926 |
CRC-32/BZIP2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | hamis | hamis | 0xFFFFFFFF | 0xFC891918 |
CRC-32C | 32 | 0x1EDC6F41 | 0xFFFFFFFF | igaz | igaz | 0xFFFFFFFF | 0xE3069283 |
CRC-32D | 32 | 0xA833982B | 0xFFFFFFFF | igaz | igaz | 0xFFFFFFFF | 0x87315576 |
CRC-32/MPEG-2 | 32 | 0x4C11DB7 | 0xFFFFFFFF | hamis | hamis | 0x0 | 0x376E6E7 |
CRC-32/POSIX | 32 | 0x4C11DB7 | 0x0 | hamis | hamis | 0xFFFFFFFF | 0x765E7680 |
CRC-32Q | 32 | 0x814141AB | 0x0 | hamis | hamis | 0x0 | 0x3010BF7F |
CRC-32/JAMCRC | 32 | 0x4C11DB7 | 0xFFFFFFFF | igaz | igaz | 0x0 | 0x340BC6D9 |
CRC-32/XFER | 32 | 0xAF | 0x0 | hamis | hamis | 0x0 | 0xBD0BE338 |
CRC-40/GSM | 40 | 0x4820009 | 0x0 | hamis | hamis | 0xFFFFFFFFFF | 0xD4164FC646 |
CRC-64 | 64 | 0x42F0E1EBA9EA3693 | 0x0 | hamis | hamis | 0x0 | 0x6C40DF5F0B497347 |
CRC-64/WE | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFF | hamis | hamis | 0xFFFFFFFFFFFFFF | 0x62EC59E3F1A4F00A |
CRC-64/XZ | 64 | 0x42F0E1EBA9EA3693 | 0xFFFFFFFFFFFFFF | igaz | igaz | 0xFFFFFFFFFFFFFF | 0x995DC9BBDF1939FA |
Hash függvények | |
---|---|
Általános rendeltetésű | |
Kriptográfia | |
Kulcsgenerálási funkciók | |
Csekkszám ( összehasonlítás ) | |
Hashes |
|