CRC-kalkulator

Beregn CRC-8/CCITT, CRC-16/CCITT-FALSE, CRC-16/MODBUS, CRC-32/ISO-HDLC (den som brukes i zlib/PNG/gzip), 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 eller Adler-32 over tekst, heksbyte eller hele filer — flere parametersett samtidig, med de nøyaktige parametrene (poly, init, refin, refout, xorout) skrevet ut ved siden av hver verdi, så en uoverensstemmelse aldri er et mysterium. For kryptografiske digester (MD5/SHA-2/SHA-3/BLAKE2) se Hash-generatoren.
Kjører helt lokalt — ingenting lastes opp. Filer opptil 200 MB.
Inndata: Utdata:
Algoritmer:
Linjer har formen «ALGORITME  verdi» etterfulgt av en innrykket parameterlinje, så et kopiert resultat sier alltid hvilket parametersett som produserte det.
Hvilken CRC er det man trenger?
Hvis en spesifikasjon bare sier «CRC-32», betyr det nesten alltid CRC-32/ISO-HDLC — den som ligger i zlib, gzip, PNG, ZIP og Ethernet. CRC-32C (Castagnoli) er den maskinvareakselererte i moderne prosessorer, brukt av iSCSI, ext4, btrfs og ZFS. cksum samsvarer med POSIX-kommandoen cksum (den legger til filens lengde før divisjon). CRC-16/MODBUS er RTU-rammens kontrollsum for Modbus-enheter; CRC-16/CCITT-FALSE er vanlig i smartkort. CRC-64/XZ finnes i .xz-arkiver; Redis-klynger bruker CRC-64/REDIS for hash-spor. Adler-32 er zlibs raske alternativ til CRC-32. Hvis to verktøy er uenige, sammenlign deres poly/init/xorout-rader — parametersettet, ikke navnet, definerer resultatet.
Selvtest
Kjører sidens motorer mot de publiserte kontrollverdiene («123456789») for alle 14 parametersettene, pluss kontroller for heksparsing og gjengivelse i desimal og oktal. Ingenting sendes noen vei.
CRC — syklisk redundanskontroll, forklart fra grunnen
Med én setning: en CRC behandler dataene som ett gigantisk binært tall, deler det på et fast «generator»-tall ved hjelp av XOR i stedet for subtraksjon, og rapporterer resten — et kompakt fingeravtrykk som endrer seg voldsomt selv om én bit i inndataene snur, og det er derfor alt fra PNG-filer til Modbus-ledninger bærer en.
Hva en CRC egentlig er

Divisjonsbildet. Still opp bytene som ett langt binært tall. Velg en divisor — polynomet, f.eks. 0x04C11DB7 for CRC-32. Utfør binær lang divisjon der «subtraksjon» er XOR-operasjonen: hver gang den ledende biten i den løpende resten er 1, XOR-er man inn divisoren, skifter til venstre og gjentar. Etter at hele meldingen er gjennomgått, er det som er igjen i registeret CRC-en. Ingen nøkler, ingen tabeller i definisjonen — bare divisjon med en rest.

De fem parameterne. To systemer kan begge si «CRC-32» og likevel være uenige, fordi navnet alene ikke fastsetter noe. Den fullstendige oppskriften trenger fem verdier: poly (divisoren), init (hva registeret starter som — nullstilt lar ledende nullbyte forsvinne, alle enere gjør ikke det), refin/refout (om hver inndatabyte — og det endelige registeret — er bitreversert, en arv fra seriell maskinvare som sendte bit minst-signifikant først), og xorout (en endelig XOR-maske, så en rekke etterfølgende nuller fortsatt endrer svaret). Denne siden skriver ut alle fem ved siden av hvert resultat nettopp av den grunnen.

Hvorfor den oppdager feil. En godt valgt divisor gjør at resten av en melding og resten av den samme meldingen med noen få snudde bit er ulike med overveldende sannsynlighet: en god CRC-32 fanger alle 1-bit- og 2-bit-feil, alle oddetall av bitfeil, og hvert utbrudd på opptil 32 sammenhengende ødelagte bit — garantert, ikke probabilistisk. Den garantien gjelder tilfeldig ødeleggelse, og det er den som gjør CRC-er til riktig verktøy for støyende ledninger og skjøre disker.

Hva en CRC ikke er

Ikke en kryptografisk hash. Det finnes ingen hemmelighet og ingen enveisegenskap: hvem som helst som kjenner parametrene kan forfalske en melding med hvilken som helst CRC de vil, på millisekunder, ved å legge til fire korrigerende byte. En CRC oppdager ulykker, aldri motstandere. For nedlastinger som verifiseres mot ukjente parter, er signaturer viktige — se i stedet Hash-generatoren (MD5/SHA/BLAKE2). Den siden forklarer også hvorfor MD5 og SHA-1 er pensjonert for fiendtlige sammenhenger, mens SHA-256 står.

Ikke en feilkorrigerende kode. En CRC forteller at noe endret seg, ikke hva som endret seg. Å reparere feil underveis er jobben til koder som Reed–Solomon eller Hamming, som bevisst lagrer overflødig struktur som en dekoder kan reversere.

Ikke komprimering eller kryptering. Resten er noen få byte uansett inndatastørrelse, og fra den kan man ikke gjenopprette inndataene — men i motsetning til en kryptografisk hash er det bare fordi informasjon ble kastet, ikke fordi invertering er vanskelig.

Familiene på denne siden

CRC-32-kvartettene. Fire av denne sidens oppføringer deler polyet 0x04C11DB7 og gir likevel ulike verdier: ISO-HDLC (reflektert, init/xorout alle enere) er «den» CRC-32 i zlib, gzip, PNG og ZIP; BZIP2 er den samme matematikken uten reflektering; MPEG-2 er BZIP2 uten endelig XOR; POSIX starter fra null og er grunnlaget for kommandoen cksum (som i tillegg legger filens lengde til divisjonen, så cksum av en fil og CRC-32/POSIX av de samme bytene er ulike). CRC-32C (Castagnoli, poly 0x1EDC6F41) er den femte søsken: et annet poly valgt for bedre feildeteksjonsytelse, og det moderne x86- og ARM-prosessorer kan beregne i minnehastighet med én instruksjon.

CRC-64-kvartetten. XZ bruker ECMA-182-polynomet i reflektert form med alle-enere-init og xorout; ECMA-182 selv er den ureflekterte originalen med null-init fra DLT-1-båndstandarden; GO-ISO er Gos crc64.ISO, et lite poly 0x1B, fortsatt reflektert; REDIS bruker et poly valgt for god lavinevirkning i tildeling av hash-spor. Sekstifire bit er størrelsen der CRC-er begynner å bli brukt som hashfunksjoner (bøttefordeling) heller enn rene kontrollsummer.

Adler-32 er utenforstående: den er ingen divisjon i det hele tatt. Den summerer bytene (A, som starter på 1) og summerer disse summene (B), begge modulo 65521, og setter sammen de to 16-bit-summene. Den er raskere enn CRC-32 i programvare, og zlib bruker den for deflate-strømmer — men for korte inndata (under noen få hundre byte) bærer summen for lite informasjon, og derfor bytter zlib tilbake til CRC-32 for små blokker.

CRC-8 og CRC-16 overlever der byte er dyre: CRC-8/CCITT (poly 0x07) beskytter enkeltbyte i headere i SMBus og mobilradioprotokoller; CRC-16/CCITT-FALSE beskytter blokker på smartkort; CRC-16/MODBUS er kontrollsummen i hver Modbus RTU-ramme på fabrikkgulv over hele verden.

Hvor hver av dem brukes
ParametersettFinnes i
CRC-32/ISO-HDLCzlib, gzip, PNG, ZIP, Ethernet (FCS), mange arkivformater
CRC-32CiSCSI, ext4, btrfs, ZFS, SSE4.2/ARMv8 maskinvareinstruksjonen CRC32C
CRC-32/BZIP2.bz2-arkivstrøm
CRC-32/MPEG-2MPEG-2-transportstrømmer
CRC-32/POSIX & cksumUtdata fra POSIX-kommandoen cksum (cksum file.txt)
CRC-16/MODBUSModbus RTU-rammer (industrielle PLS-er, målere, omformere)
CRC-16/CCITT-FALSEsmartkort, X.25-nære forbindelser, noen GPS-protokoller
CRC-8/CCITTSMBus (PEC-byte), mobilradioheadere
CRC-64/XZ.xz-containerens integritetskontroller
CRC-64/ECMA-182ECMA-182 / DLT-1-båndstandarden
CRC-64/GO-ISOGo-standardbiblioteket crc64.ISO
CRC-64/REDISRedis-klyngens tildeling av hash-spor
Adler-32zlib-strømmer (deflate), andre sammenhenger med rask kontrollsum
Ankertabellen — check(«123456789»)

Konvensjonen i CRC-katalogen er å publisere resultatet for ASCII-strengen 123456789 (9 byte). Hver verdi nedenfor kan reproduseres på denne siden: skriv 123456789 i tekstboksen, kryss av algoritmen, og klikk på Beregn.

ParametersettBreddeKontrollverdi (heks)
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

Kilder: hver verdi er krysssjekket med en uavhengig bitvis referanseimplementasjon og, der en finnes, mot systembiblioteket som leverer algoritmen (zlib for CRC-32 og Adler-32; Greg Cook CRC-katalogen for resten).

Vanlige feil
  • «CRC-32» uten parametere. Mellom ISO-HDLC, BZIP2, MPEG-2, POSIX og CRC-32C sirkulerer fem ulike verdier under samme navn. Før alltid poly/init/refin/refout/xorout sammen med resultatet — denne siden skriver dem ut.
  • Å sammenligne en fils CRC-32 med utdataene fra cksum. Ulike algoritmer: cksum legger til lengden og bruker en annen init. Tallene vil ikke stemme, og begge er «riktige».
  • Å stole på CRC mot manipulering. Å forfalske en matchende CRC er en klassisk øvelse (patch de siste 4 bytene). Bruk en nøklet MAC (HMAC) eller en signatur når den andre siden kan være fiendtlig.
  • Å forvente lavinevirkning. En CRC er lineær: beslektede meldinger gir beslektede CRC-er. Greit for støy, feil for hashing — hvis det er behov for bøttefordeling, er CRC-64 eller en ekte hash tryggere enn CRC-32.
  • Heks-tekst mot bytes. Strengen "123456789" (9 ASCII-byte, 31 32 33 34 35 36 37 38 39) og tallet 0x123456789 er ulike inndata med ulike CRC-er. Bruk fanen for heksbyte når kildedataene virkelig er binære.
Ofte stilte spørsmål

Hvorfor stemmer ikke min CRC-32 med den i ZIP-filen? ZIPs CRC-32 er ISO-HDLC over de ukomprimerte dataene. Sørg for at man hashet de samme bytene (ikke den komprimerte strømmen), den samme modusen (tekst mot heks) og det samme parametersettet — parameterlinjen under hvert resultat er der for å gjøre den kontrollen øyeblikkelig.

Hva er best, CRC-32C eller CRC-32? For tilfeldig feildeteksjon fanger begge alle utbrudd på opptil 32 bit; CRC-32C presterer bedre på noen feilmønstre og er den som har CPU-instruksjoner — praktisk talt gratis i gigabithastigheter. Grunnen til at CRC-32/ISO-HDLC overlever, er kompatibilitet: tretti år med arkiver snakker den.

Er CRC-64 sterkere enn CRC-32? Den oppdager lengre utbrudd (opptil 64 bit) og kolliderer langt mindre når den brukes til bøttefordeling, men den er like lett å forfalske — bredde gir deteksjonsgarantier, ikke sikkerhet.

Kan en CRC reverseres for å avsløre inndataene? Nei — uendelig mange inndata deler en CRC. Men i motsetning til en kryptografisk hash kan en angriper konstruere et inndata med hvilken som helst CRC de velger, og det er i den forstand den ikke er enveis i det hele tatt.