CRC checksum nedir?
Döngüsel Artıklık Denetimi (CRC), ağ iletişimi, veri depolama ve dosya formatlarında (Ethernet, ZIP, PNG, Modbus, USB ve daha fazlası) yaygın olarak kullanılan bir hata tespit kodudur. Verinizi uzun bir ikili sayı gibi ele alır ve onu, taşımasız ikili aritmetik (GF(2); burada toplama ve çıkarma işlemlerinin ikisi de XOR'dur) kullanarak sabit bir üreteç polinomuna böler. Bu bölme işleminden kalan değer CRC'dir. Mesajın tek bir biti bile değişse, kalan da neredeyse her zaman değişir; CRC'yi iletim ve depolama hatalarını yakalamada bu denli başarılı kılan da budur.
Bu hesaplama aracı nasıl kullanılır?
Giriş kutusuna herhangi bir ASCII metin yazın, ihtiyacınız olan CRC türünü seçin ve sonucu görün. Araç, checksum değerini hem onaltılık (hex) hem de onluk (decimal) biçimde gösterir; ayrıca bit genişliğini ve işlenen bayt sayısını da bildirir. Üç yaygın türü destekler:
CRC-8 — polinom \(\mathtt{0x07}\), başlangıç değeri \(\mathtt{0x00}\).
CRC-16/CCITT-FALSE — polinom \(\mathtt{0x1021}\), başlangıç değeri \(\mathtt{0xFFFF}\), yansıtma yok.
CRC-32 (IEEE 802.3) — yansıtılmış polinom \(\mathtt{0xEDB88320}\), başlangıç \(\mathtt{0xFFFFFFFF}\), son XOR \(\mathtt{0xFFFFFFFF}\). Bu, ZIP, gzip ve Ethernet'in kullandığı türdür.
Formülün açıklaması
Kavramsal olarak, \(M(x)\) mesajı \(x^n\) ile çarpılır (burada \(n\) üretecin derecesidir) ve \(G(x)\)'e bölünür. Pratikte ise her seferinde bir bit kaydırdığımız bir yazmaç (register) kullanırız; en anlamlı bit 1 olduğunda polinomu XOR'larız. Yansıtılmış türler (CRC-32 gibi) bitleri en anlamsız bitten başlayarak işler ve sola değil sağa kaydırır.
$$\text{CRC} = \mathrm{XorOut} \oplus \bigoplus_{b \in \text{Message bytes}} \mathrm{Update}_{\text{poly}}(\text{crc}, b)$$$$\text{where (CRC-16/CCITT-FALSE)}\quad \left\{ \begin{aligned} \text{poly} &= \mathtt{0x1021} \\ \mathrm{init} &= \mathtt{0xFFFF} \\ \mathrm{XorOut} &= \mathtt{0x0000} \\ \text{width} &= 16 \text{ bits (MSB-first, no reflection)} \end{aligned} \right.$$
Çözümlü örnek
Klasik kontrol dizisi 123456789 için: CRC-16/CCITT-FALSE sonucu 0x29B1 (onluk 10673), CRC-32/IEEE sonucu ise 0xCBF43926 (onluk 3421780262) olur. Bunlar CRC referans kataloglarında yayımlanan standart "kontrol" değerleridir; dolayısıyla herhangi bir uygulamayı bu değerlere karşı doğrulayabilirsiniz.
Sıkça Sorulan Sorular
Sonucum neden başka bir araçtan farklı çıkıyor? CRC türleri polinom, başlangıç değeri, bit yansıtması ve son XOR açısından birbirinden farklıdır. Tam olarak aynı türü karşılaştırdığınızdan emin olun.
CRC güvenli bir hash mi? Hayır. CRC, kazara oluşan hataları tespit eder ancak kasıtlı olarak taklit edilmesi son derece kolaydır. Güvenlik için SHA-256 veya benzeri bir algoritma kullanın.
Hangi kodlama kullanılıyor? CRC hesaplanmadan önce her karakter, 8 bitlik ASCII/Latin-1 bayt değeri olarak alınır.