Jak używać
- Wpisz lub wklej tekst, ustaw „Wejście jako” na „Hex”, aby podać surowe bajty, albo kliknij „Otwórz plik”, aby obliczyć sumę kontrolną jego zawartości.
- W polu „Algorytm” pozostaw CRC-32 dla ZIP, gzip i PNG albo wybierz CRC-32C dla iSCSI, ext4, Btrfs i Google Cloud Storage.
- W polu „Wyjście jako” wybierz „hex (małe litery)”, „HEX (wielkie litery)”, „Dziesiętny” lub „Base64”.
- Aby zweryfikować wynik, wklej oczekiwaną sumę kontrolną do pola „Porównaj z” jako hex bez 0x, liczbę dziesiętną lub Base64.
Czym jest suma kontrolna CRC32
Cykliczna kontrola nadmiarowa (CRC) traktuje dane wejściowe jako jeden długi wielomian binarny, dzieli go przez stały wielomian generujący i zachowuje resztę z dzielenia. W CRC-32 reszta ma 32 bity i zwykle zapisuje się ją jako 8 cyfr szesnastkowych lub jako liczbę bez znaku z zakresu od 0 do 4 294 967 295. Niemal każda zmiana danych zmienia tę resztę.
Kody CRC zaprojektowano z myślą o błędach, które powstają w rzeczywistych kablach, łączach radiowych i na dyskach. CRC-32 wykrywa każdy ciąg przekłamanych bitów (błąd grupowy) o długości do 32 bitów, a losowe uszkodzenie pozostaje niezauważone średnio tylko raz na 4,3 miliarda przypadków. CRC-32 oblicza się też bardzo szybko, dlatego jest wbudowany w ZIP, gzip, PNG i ramki Ethernet.
CRC-32 i CRC-32C
| CRC-32 | CRC-32C (Castagnoli) | |
|---|---|---|
| Wielomian | 0x04C11DB7, w postaci odwróconej 0xEDB88320 | 0x1EDC6F41, w postaci odwróconej 0x82F63B78 |
Wartość kontrolna dla 123456789 | cbf43926 | e3069283 |
| Zastosowania | ZIP, gzip, PNG, Ethernet | iSCSI, SCTP, metadane ext4, Btrfs, Google Cloud Storage |
| Obsługa sprzętowa | Instrukcje CRC32 w ARMv8 | Instrukcja crc32 z x86 SSE4.2, ARMv8 |
Oba warianty zaczynają od wartości 0xFFFFFFFF, przetwarzają bity każdego bajtu od najmniej znaczącego i na końcu negują bitowo wynik; różnią się tylko wielomianem, więc te same dane dają dwa zupełnie niezwiązane wyniki. Pierwszy wariant większość narzędzi nazywa po prostu „CRC32”; w katalogach algorytmów CRC figuruje on jako CRC-32/ISO-HDLC. CRC-32C przyjęto później w protokołach pamięci masowej i sieciowych ze względu na lepsze wykrywanie błędów. Google Cloud Storage podaje CRC-32C, a Amazon S3 dowolny z wariantów, w postaci Base64 czterech bajtów w kolejności big-endian – dokładnie tak, jak pokazuje to wyjście Base64.
Suma kontrolna, a nie zabezpieczenie
CRC chroni przed przypadkowymi błędami, a nie przed atakami. Jest funkcją liniową, więc każdy może zmodyfikować plik, a następnie tak dobrać cztery bajty, aby jego CRC-32 pozostał bez zmian. Zgodność CRC nie dowodzi zatem niczego w kwestii celowej manipulacji. Aby sprawdzić pobrany plik, porównaj hash SHA-256 z zaufanego źródła; aby udowodnić, kto wysłał wiadomość, użyj HMAC.
32 bity to także za mało, by jednoznacznie identyfikować dane. Wśród około 77 000 losowych plików prawdopodobieństwo, że dwa z nich mają ten sam CRC-32, sięga już 50%, dlatego nie używaj go jako unikalnego identyfikatora ani klucza deduplikacji. Tam, gdzie nie ma atakującego, MD5 lub SHA-256 znacznie lepiej sprawdzają się jako odciski danych.
CRC32 w kodzie
# Python: w Pythonie 3 zlib.crc32 zwraca wartość bez znaku;
# "& 0xffffffff" jest potrzebne tylko w Pythonie 2
import zlib
format(zlib.crc32(b'123456789'), '08x') # 'cbf43926'
// Node.js 20.15+ i 22.2+
require('zlib').crc32('123456789').toString(16).padStart(8, '0') // 'cbf43926'
// Go (import "hash/crc32")
crc32.ChecksumIEEE(data) // CRC-32
crc32.Checksum(data, crc32.MakeTable(crc32.Castagnoli)) // CRC-32C
// Java: java.util.zip.CRC32, a od Javy 9 także java.util.zip.CRC32C
// PHP
sprintf('%08x', crc32('123456789')); // 'cbf43926'
hash('crc32b', '123456789'); // 'cbf43926', ten sam CRC-32
hash('crc32c', '123456789'); // 'e3069283'
hash('crc32', '123456789'); // '181989fc', inny CRC
Uważaj na nazwy w PHP: algorytm hashujący o nazwie crc32 to nie suma kontrolna z ZIP, lecz CRC używany przez bzip2, wypisywany w odwróconej kolejności bajtów. Aby uzyskać wynik zgodny z ZIP, gzip i tym narzędziem, użyj crc32b lub funkcji crc32(). Uniksowe polecenie cksum używa jeszcze innego wariantu, który dodatkowo uwzględnia długość pliku, więc jego wynik nie będzie zgodny z żadnym z nich.
Przykłady
| Wejście (UTF-8) | CRC-32 |
|---|---|
Hello, World! | ec4ac3d0 |
Base64.is | 915d7207 |
你好 | 50a2b841 |
Najczęściej zadawane pytania
Ile wynosi CRC32 ciągu „123456789”?
cbf43926 (dziesiętnie 3421780262), a CRC-32C to e3069283. Jeśli własna implementacja zwraca te wartości, używa tych samych parametrów co to narzędzie.Dlaczego mój CRC32 różni się od wyniku innego narzędzia?
cksum dają różne wyniki), bajty wejściowe (znaki końca wiersza, końcowy znak nowego wiersza, kodowanie tekstu), format liczby (niektóre języki zwracają 32-bitową liczbę całkowitą ze znakiem, przez co duże wartości stają się ujemne) oraz kolejność bajtów.Dlaczego bajty CRC w pliku ZIP lub gzip są odwrócone?
unzip -v i większość innych programów wypisują najpierw najbardziej znaczący bajt.Czy można obliczyć CRC32 dużego pliku?
Tak. Kliknij „Otwórz plik”, a suma kontrolna zostanie obliczona z bajtów pliku na urządzeniu, bez wysyłania go na serwer; zadziała każdy plik, który przeglądarka zdoła zmieścić w pamięci. Wynik można potem porównać z wartością w pliku SFV lub na liście zawartości archiwum ZIP.
Czy CRC32 to funkcja hashująca?
Przekształca dane dowolnej długości w stałą 32-bitową wartość, dlatego często wymienia się go razem z funkcjami hashującymi, ale jest to suma kontrolna: wykrywa przypadkowe błędy i nie chroni przed kimś, kto celowo zmienia dane. Jeśli potrzebny jest mocniejszy odcisk danych, tabela „Wszystkie algorytmy” pod wynikiem pokazuje MD5 i funkcje z rodziny SHA dla tych samych danych.