Do czego służą sumy kontrolne

Suma kontrolna to krótka liczba obliczana z danych, która zmienia się, gdy zmieni się choćby jeden bit. Odbiorca oblicza ją ponownie i porównuje z przesłaną: jeśli się różnią, dane uległy uszkodzeniu po drodze. CRC-32 z „123456789” to CBF43926, wartość kontrolna służąca do testowania implementacji.

Różne algorytmy mają różne zastosowania. CRC-32 to algorytm ZIP, PNG i Ethernetu; CRC-32C – iSCSI, ext4 i Btrfs; CRC-16/MODBUS – przemysłowych urządzeń Modbus RTU; CRC-16/CCITT i XMODEM – protokołów szeregowych i kart; Adler-32 – kompresji zlib, szybszy, ale słabszy dla krótkich danych.

Wariantów CRC-16 jest tak wiele, bo różnią się wielomianem, wartością początkową, odbiciem bitów i końcowym XOR: dlatego ta sama wiadomość daje różne wyniki. Jeśli masz wartość do sprawdzenia i nie znasz algorytmu, wklej ją w pole oczekiwanej wartości, a kalkulator znajdzie pasujący.

Częste błędy

  • Liczenie sumy kontrolnej tekstu zamiast bajtów: "0A" jako tekst to dwa znaki, szesnastkowo jeden bajt.
  • Mylenie wariantów CRC-16: MODBUS, ARC i CCITT dają różne wyniki dla tych samych danych.
  • Używanie CRC do weryfikacji plików z niezaufanych źródeł: łatwo go podrobić, potrzebny jest SHA-256.

Najczęstsze pytania

Dlaczego CRC Modbus wygląda na odwrócone bajtami?

Modbus przesyła CRC młodszym bajtem naprzód. Jeśli obliczona wartość to 4B37, w wiadomości pojawiają się bajty 37 4B.

Czym różni się CRC-32 od CRC-32C?

Używają różnych wielomianów: wielomian Castagnolego (32C) lepiej wykrywa niektóre błędy i ma własne instrukcje w nowoczesnych procesorach, dlatego jest preferowany w pamięciach masowych i szybkich sieciach.

Czy dwa różne pliki mogą mieć tę samą sumę kontrolną?

Tak: 32 bity dają około 4 miliardów wartości, więc przypadkowe kolizje zdarzają się przy wielu plikach, a celowe ich stworzenie jest banalne.

Jak działa to obliczenie

CRC: dane traktuje się jak wielomian nad bitami i dzieli przez wielomian generujący; reszta jest sumą kontrolną. Każdy wariant określają szerokość, wielomian, wartość początkowa, odbicie wejścia i wyjścia oraz końcowy XOR (np. CRC-32: 32 bity, 0x04C11DB7, początkowa 0xFFFFFFFF, odbity, XOR 0xFFFFFFFF). Adler-32: A = 1 + suma bajtów, B = suma kolejnych wartości A, obie modulo 65521, wynik B·65536 + A. Fletcher-16: to samo modulo 255 i bez początkowej 1.