Calculator CRC

Calculează CRC-8/CCITT, CRC-16/CCITT-FALSE, CRC-16/MODBUS, CRC-32/ISO-HDLC (cel din 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 sau Adler-32 peste text, octeți hexazecimali sau fișiere întregi — mai multe seturi de parametri deodată, cu parametrii exacți (poly, init, refin, refout, xorout) afișându-se lângă fiecare valoare, astfel încât o nepotrivire să nu fie niciodată un mister. Pentru digesturi criptografice (MD5/SHA-2/SHA-3/BLAKE2) se folosește Generatorul hash.
Rulează integral local — nimic nu se încarcă. Fișiere de până la 200 MB.
Intrare: Ieșire:
Algoritmi:
Liniile au forma „ALGORITM  valoare” urmată de o linie de parametri indentată, astfel încât un rezultat copiat și lipit indică întotdeauna setul de parametri care l-a produs.
Ce CRC este necesar?
Dacă o specificație spune doar „CRC-32”, aproape întotdeauna înseamnă CRC-32/ISO-HDLC — cel din zlib, gzip, PNG, ZIP și Ethernet. CRC-32C (Castagnoli) este varianta accelerată hardware din procesoarele moderne, folosită de iSCSI, ext4, btrfs și ZFS. cksum corespunde comenzii POSIX cksum (adaugă lungimea fișierului înainte de împărțire). CRC-16/MODBUS este suma de control a cadrelor RTU ale dispozitivelor Modbus; CRC-16/CCITT-FALSE este frecventă la cardurile cu cip. CRC-64/XZ apare în arhivele .xz; clusterul Redis folosește CRC-64/REDIS pentru sloturile de hash. Adler-32 este alternativa rapidă a lui zlib la CRC-32. Dacă două instrumente nu se înțeleg, se compară rândurile lor poly/init/xorout — setul de parametri, nu numele, definește rezultatul.
Autotest
Rulează motoarele paginii împotriva valorilor de verificare publicate („123456789”) pentru toate cele 14 seturi de parametri, plus verificări de analiză hexazecimală și de redare zecimală/octală. Nimic nu se trimite nicăieri.
CRC — verificarea ciclică a redundanței, explicată de la zero
Într-o propoziție: un CRC tratează datele ca pe un număr binar gigantic, îl împarte la un număr „generator” fix folosind XOR în loc de scădere și raportează restul — o amprentă compactă care se schimbă brusc chiar și când se inversează un singur bit din intrare, de aceea totul, de la fișierele PNG la firele Modbus, poartă unul.
Ce este de fapt un CRC

Imaginea împărțirii. Se aliniază octeții ca un singur număr binar lung. Se alege un divizor — polinomul, de exemplu 0x04C11DB7 pentru CRC-32. Se efectuează împărțirea binară lungă, în care „scăderea” este operația XOR: ori de câte ori bitul din față al restului curent este 1, se face XOR cu divizorul, se deplasează spre stânga și se repetă. După ce tot mesajul a trecut, ce rămâne în registru este CRC-ul. Fără chei, fără tabele în definiție — doar împărțire cu rest.

Cei cinci parametri. Două sisteme pot spune amândouă „CRC-32” și totuși nu se înțeleg, deoarece numele singur nu fixează nimic. Rețeta completă are nevoie de cinci valori: poly (divizorul), init (cu ce pornește registrul — init format din zerouri face ca octeții nuli de la început să nu conteze, iar init format din unu nu), refin/refout (dacă fiecare octet de intrare — și registrul final — este inversat pe biți, o moștenire a hardware-ului serial care trimitea biții începând cu cel mai puțin semnificativ) și xorout (o mască XOR finală, astfel încât o serie de zerouri de la coadă să schimbe în continuare răspunsul). Această pagină tipărește toți cei cinci lângă fiecare rezultat exact din acest motiv.

De ce detectează erori. Un divizor bine ales face ca restul unui mesaj și restul aceluiași mesaj cu câțiva biți cu valoare inversată să difere cu o probabilitate covârșitoare: un CRC-32 bun prinde toate erorile de 1 și de 2 biți, toate numerele impare de erori de biți și orice rafală de până la 32 de biți consecutivi corupți — garantat, nu probabilistic. Această garanție privește corupția accidentală, iar ea face din CRC-uri instrumentul potrivit pentru cabluri zgomotoase și discuri defecte.

Ce nu este un CRC

Nu este un hash criptografic. Nu există secret și nicio unidirecționalitate: oricine cunoaște parametrii poate falsifica un mesaj cu orice CRC dorește, în milisecunde, adăugând patru octeți de corecție. Un CRC detectează accidentele, niciodată adversarii. Pentru descărcări verificate față de necunoscuți contează semnăturile — vezi Generatorul hash (MD5/SHA/BLAKE2). Pagina aceea explică și de ce MD5 și SHA-1 sunt retrase pentru contexte ostile, în timp ce SHA-256 rămâne valabil.

Nu este un cod de corectare a erorilor. Un CRC arată că ceva s-a schimbat, nu ce s-a schimbat. Repararea erorilor din mers este treaba unor coduri precum Reed–Solomon sau Hamming, care stochează deliberat o structură redundantă pe care un decodor o poate inversa.

Nu este compresie și nu este criptare. Restul are câțiva octeți indiferent de dimensiunea intrării, iar din el nu se poate recupera intrarea — dar, spre deosebire de un hash criptografic, asta se întâmplă doar pentru că informația a fost aruncată, nu pentru că inversarea ar fi grea.

Familiile din această pagină

Cvartetul CRC-32. Patru dintre intrările acestei pagini împart polinomul 0x04C11DB7 și totuși produc valori diferite: ISO-HDLC (reflectat, init/xorout formate din unu) este „CRC-32-ul” din zlib, gzip, PNG și ZIP; BZIP2 este aceeași matematică nereflectată; MPEG-2 este BZIP2 fără XOR final; POSIX pornește de la zero și este baza comenzii cksum (care adaugă în plus lungimea fișierului la împărțire, deci cksum al unui fișier și CRC-32/POSIX al acelorași octeți diferă). CRC-32C (Castagnoli, polinomul 0x1EDC6F41) este al cincilea frate: un polinom diferit, ales pentru o performanță mai bună a detectării erorilor, și cel pe care procesoarele moderne x86 și ARM îl pot calcula la viteza memoriei, cu o singură instrucțiune.

Cvartetul CRC-64. XZ folosește polinomul ECMA-182 în formă reflectată, cu init și xorout formate din unu; ECMA-182 în sine este originalul nereflectat, cu init zero, din standardul benzii DLT-1; GO-ISO este crc64.ISO din Go, cu un polinom mic 0x1B, încă reflectat; REDIS folosește un polinom ales pentru un bun efect de avalanșă la atribuirea sloturilor de hash. Șaizeci și patru de biți este dimensiunea la care CRC-urile încep să fie folosite ca funcții hash (împărțire pe categorii), nu ca simple sume de control.

Adler-32 este outsiderul: nu este deloc o împărțire. Însumează octeții (A, pornind de la 1) și însumează aceste sume (B), ambele modulo 65521, și concatenează cele două sume de 16 biți. Este mai rapid decât CRC-32 în software, iar zlib îl folosește pentru fluxurile deflate — dar pentru intrări scurte (sub câteva sute de octeți) suma poartă prea puțină informație, motiv exact pentru care zlib revine la CRC-32 pentru blocuri mici.

CRC-8 și CRC-16 supraviețuiesc acolo unde octeții sunt scumpi: CRC-8/CCITT (polinom 0x07) protejează octeți singulari din antet în SMBus și în protocoalele radiourilor celulare; CRC-16/CCITT-FALSE protejează blocurile cardurilor cu cip; CRC-16/MODBUS este suma de control a fiecărui cadru Modbus RTU din halele de fabrică din întreaga lume.

Unde trăiește fiecare
Setul de parametriSe găsește în
CRC-32/ISO-HDLCzlib, gzip, PNG, ZIP, Ethernet (FCS), multe formate de arhivă
CRC-32CiSCSI, ext4, btrfs, ZFS, instrucțiunea hardware CRC32C din SSE4.2/ARMv8
CRC-32/BZIP2Flux de arhivă .bz2
CRC-32/MPEG-2Fluxuri de transport MPEG-2
CRC-32/POSIX & cksumIeșirea comenzii POSIX cksum (cksum file.txt)
CRC-16/MODBUSCadre Modbus RTU (PLC-uri industriale, contoare, invertoare)
CRC-16/CCITT-FALSECarduri cu cip, legături apropiate de X.25, unele protocoale GPS
CRC-8/CCITTSMBus (octetul PEC), antete ale radiourilor celulare
CRC-64/XZVerificări de integritate ale containerului .xz
CRC-64/ECMA-182ECMA-182 / standardul benzii DLT-1
CRC-64/GO-ISOBiblioteca standard Go crc64.ISO
CRC-64/REDISAtribuirea sloturilor de hash din clusterul Redis
Adler-32Fluxuri zlib (deflate), alte contexte cu sumă de control rapidă
Tabelul de ancorare — check(„123456789”)

Convenția catalogului CRC este să se publice rezultatul pentru șirul ASCII 123456789 (9 octeți). Fiecare valoare de mai jos poate fi reprodusă pe această pagină: se scrie 123456789 în caseta Text, se bifează algoritmul și se apasă Calculare.

Setul de parametriLățimeValoarea de verificare (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

Surse: fiecare valoare a fost verificată încrucișat cu o implementare bit cu bit independentă de referință și, acolo unde există, cu biblioteca de sistem care livrează algoritmul (zlib pentru CRC-32 și Adler-32; catalogul CRC al lui Greg Cook pentru restul).

Greșeli frecvente
  • „CRC-32” fără parametri. Între ISO-HDLC, BZIP2, MPEG-2, POSIX și CRC-32C circulă cinci valori diferite sub același nume. Se notează întotdeauna poly/init/refin/refout/xorout împreună cu rezultatul — această pagină le tipărește automat.
  • Compararea CRC-32 al unui fișier cu ieșirea cksum. Algoritmi diferiți: cksum adaugă lungimea și folosește un init diferit. Numerele nu vor coincide, iar ambele sunt „corecte”.
  • Încrederea în CRC împotriva manipulării. Falsificarea unui CRC care se potrivește este un exercițiu clasic (se modifică ultimii 4 octeți). Se folosește un MAC cu cheie (HMAC) sau o semnătură atunci când cealaltă parte ar putea fi ostilă.
  • Așteptarea efectului de avalanșă. Un CRC este liniar: mesajele înrudite dau CRC-uri înrudite. Potrivit pentru zgomot, nepotrivit pentru hashing — dacă este nevoie de împărțire pe categorii, CRC-64 sau un hash real este mai sigur decât CRC-32.
  • Text hexazecimal față de octeți. Șirul "123456789" (9 octeți ASCII, 31 32 33 34 35 36 37 38 39) și numărul 0x123456789 sunt intrări diferite, cu CRC-uri diferite. Se folosește fila Octeți hexazecimali atunci când datele sursă sunt cu adevărat binare.
Întrebări frecvente

De ce nu se potrivește CRC-32-ul cu cel din fișierul ZIP? CRC-32 din ZIP este ISO-HDLC peste datele necomprimate. Se verifică dacă s-au calculat hash-urile acelorași octeți (nu fluxul comprimat), același mod (text sau hexazecimal) și același set de parametri — linia cu parametri tipărită sub fiecare rezultat există tocmai pentru ca verificarea să fie imediată.

Care este mai bun, CRC-32C sau CRC-32? Pentru detectarea erorilor accidentale, ambele prind toate rafalele de până la 32 de biți; CRC-32C performează mai bine pe unele tipare de erori și are instrucțiuni dedicate în procesor — efectiv gratuit la viteze de gigabit. Motivul pentru care CRC-32/ISO-HDLC supraviețuiește este compatibilitatea: treizeci de ani de arhive îl vorbesc.

Este CRC-64 mai puternic decât CRC-32? Detectează rafale mai lungi (până la 64 de biți) și se ciocnește mult mai rar când este folosit pentru împărțirea pe categorii, dar este la fel de ușor de falsificat — lățimea aduce garanții de detectare, nu securitate.

Poate fi inversat un CRC pentru a dezvălui intrarea? Nu — infinit de multe intrări au același CRC. Dar, spre deosebire de un hash criptografic, un atacator poate construi o intrare cu orice CRC dorește, ceea ce înseamnă că nu este deloc unidirecțional.