Nasıl kullanılır
- Metni yazın veya yapıştırın, ham baytlar için girdi biçimini "Onaltılık" olarak değiştirin ya da içeriğinin sağlama toplamını almak için "Dosya aç" ile bir dosya açın.
- ZIP, gzip ve PNG için CRC-32'yi seçili bırakın; iSCSI, ext4, Btrfs ve Google Cloud Storage için CRC-32C'yi seçin.
- Çıktıyı seçin: "hex (küçük harf)", "HEX (büyük harf)", "Ondalık" veya "Base64".
- Doğrulamak için beklenen sağlama toplamını "Karşılaştırılacak değer" alanına 0x öneki olmadan hex, ondalık veya Base64 olarak yapıştırın.
CRC32 sağlama toplamı nedir?
Döngüsel artıklık denetimi (cyclic redundancy check, CRC), girdiyi tek ve uzun bir ikili polinom olarak ele alır, onu sabit bir üreteç polinomuna böler ve kalanı saklar. CRC-32'de kalan 32 bittir; genellikle 8 hex basamağı veya 0 ile 4.294.967.295 arasında işaretsiz bir sayı olarak yazılır. Veride yapılan neredeyse her değişiklik kalanı da değiştirir.
CRC'ler gerçek kabloların, telsiz bağlantılarının ve disklerin ürettiği hatalar için tasarlanmıştır. CRC-32, 32 bit uzunluğa kadar her ardışık bozuk bit dizisini (burst) tespit eder; rastgele bir bozulma ise yaklaşık 4,3 milyar durumda yalnızca bir kez fark edilmeden kalır. Hesaplanması da çok hızlıdır; ZIP, gzip, PNG ve Ethernet çerçevelerinde yerleşik olarak bulunmasının nedeni budur.
CRC-32 ve CRC-32C
| CRC-32 | CRC-32C (Castagnoli) | |
|---|---|---|
| Polinom | 0x04C11DB7, yansıtılmış hâli 0xEDB88320 | 0x1EDC6F41, yansıtılmış hâli 0x82F63B78 |
123456789 için kontrol değeri | cbf43926 | e3069283 |
| Kullanıldığı yerler | ZIP, gzip, PNG, Ethernet | iSCSI, SCTP, ext4 meta verileri, Btrfs, Google Cloud Storage |
| Donanım desteği | ARMv8 CRC32 komutları | x86 SSE4.2 crc32 komutu, ARMv8 |
Her ikisi de 0xFFFFFFFF değerinden başlar, her baytın bitlerini en düşük anlamlı bitten başlayarak işler ve son değerin tüm bitlerini ters çevirir. Yalnızca polinom farklıdır; bu yüzden aynı veri birbiriyle ilgisiz iki sonuç verir. İlki, çoğu aracın "CRC32" derken kastettiği algoritmadır ve kataloglarda CRC-32/ISO-HDLC adıyla geçer. CRC-32C ise daha güçlü hata tespiti sağladığı için sonradan depolama ve ağ protokollerince benimsenmiştir. Google Cloud Storage CRC-32C değerini, Amazon S3 ise her iki varyantı da dört baytın big-endian sırasıyla Base64 kodlanmış hâli olarak bildirir; Base64 çıktısının gösterdiği de tam olarak budur.
Güvenlik denetimi değil, sağlama toplamı
CRC saldırılara karşı değil, kazalara karşı koruma sağlar. Doğrusal bir fonksiyon olduğundan herkes bir dosyayı değiştirip ardından dört baytı ayarlayarak CRC-32 değerini aynı tutabilir. Bu nedenle eşleşen bir CRC, kasıtlı bir müdahale konusunda hiçbir şey kanıtlamaz. İndirilen bir dosyayı kontrol etmek için güvenilir bir kaynaktan alınan SHA-256 hash değerini karşılaştırın; bir mesajı kimin gönderdiğini kanıtlamak için HMAC kullanın.
32 bit, veriyi tanımlamak için de çok azdır. Yaklaşık 77.000 rastgele dosya arasında ikisinin aynı CRC-32 değerini paylaşma olasılığı şimdiden %50'ye ulaşır; bu yüzden onu benzersiz bir kimlik veya tekilleştirme anahtarı olarak kullanmayın. Ortada bir saldırgan yoksa MD5 veya SHA-256 çok daha iyi parmak izleri sağlar.
Kodda CRC32
# Python: zlib.crc32, Python 3'te işaretsizdir;
# "& 0xffffffff" yalnızca Python 2 için gereklidir
import zlib
format(zlib.crc32(b'123456789'), '08x') # 'cbf43926'
// Node.js 20.15+ ve 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 ve Java 9'dan itibaren java.util.zip.CRC32C
// PHP
sprintf('%08x', crc32('123456789')); // 'cbf43926'
hash('crc32b', '123456789'); // 'cbf43926', aynı CRC-32
hash('crc32c', '123456789'); // 'e3069283'
hash('crc32', '123456789'); // '181989fc', farklı bir CRC
PHP'deki adlara dikkat edin: crc32 adlı hash algoritması ZIP sağlama toplamı değil, bzip2'nin kullandığı ve ters bayt sırasıyla yazdırılan CRC'dir. ZIP, gzip ve bu araçla aynı sonucu almak için crc32b veya crc32() fonksiyonunu kullanın. Unix cksum komutu ise dosya uzunluğunu da hesaba katan başka bir varyant kullanır; bu yüzden onun verdiği sayı da eşleşmez.
Örnekler
| Girdi (UTF-8) | CRC-32 |
|---|---|
Hello, World! | ec4ac3d0 |
Base64.is | 915d7207 |
你好 | 50a2b841 |
Sıkça sorulan sorular
"123456789" dizesinin CRC32 değeri nedir?
cbf43926 (ondalık olarak 3421780262), CRC-32C değeri ise e3069283 olur. Kendi uygulamanız bu değerleri döndürüyorsa bu araçla aynı parametreleri kullanıyordur.CRC32 değerim neden başka bir aracınkinden farklı?
cksum birbirinden farklı sonuçlar verir), girdi baytları (satır sonları, sondaki bir satır sonu, metin kodlaması), sayı biçimi (bazı diller işaretli 32 bitlik bir tamsayı döndürür, bu da büyük değerleri negatif yapar) ve bayt sırası.ZIP veya gzip dosyamdaki CRC baytları neden ters sırada?
unzip -v ve diğer programların çoğu en anlamlı baytı önce yazdırır.Büyük bir dosyanın CRC32 değerini hesaplayabilir miyim?
Evet. "Dosya aç" düğmesine tıkladığınızda sağlama toplamı, dosya yüklenmeden cihazınızda dosyanın baytlarından hesaplanır; tarayıcınızın bellekte tutabildiği her dosya işlenebilir. Ardından sonucu bir SFV dosyasındaki veya bir ZIP listesindeki değerle karşılaştırabilirsiniz.
CRC32 bir hash fonksiyonu mu?
Her uzunluktaki veriyi sabit 32 bitlik bir değere eşlediği için çoğu zaman hash fonksiyonlarıyla birlikte anılır, ancak bir sağlama toplamıdır: kazara oluşan hataları tespit eder, veriyi kasıtlı olarak değiştiren birine karşı ise hiçbir koruma sağlamaz. Daha güçlü bir parmak izine ihtiyacınız olduğunda, sonucun altındaki "Tüm algoritmalar" tablosu aynı girdi için MD5 ve SHA ailesini gösterir.