Satırlar “ALGORİTMA değer” biçimini izler ve girintili bir parametre satırı izler; böylece kopyalanıp yapıştırılan bir sonuç her zaman hangi parametre kümesiyle üretildiğini söyler.
CRC — döngüsel artıklık denetimi, sıfırdan açıklanmış
Tek cümlede: bir CRC verinizi tek bir dev ikili sayı gibi ele alır, çıkarma yerine XOR kullanarak sabit bir “üreteç” sayısına böler ve kalanı bildirir — girdinin tek bir biti bile değiştiğinde çarpıcı biçimde değişen kompakt bir parmak izi; PNG dosyalarından Modbus hatlarına kadar her şeyin bir CRC taşımasının nedeni budur.
CRC gerçekte nedir
Bölme resmi. Baytlarınızı tek uzun bir ikili sayı olarak hizalayın. Bir bölen seçin — polinom, ör. CRC-32 için 0x04C11DB7. “Çıkarma” işleminin XOR olduğu ikili uzun bölme yapın: çalışan kalanın en soldaki biti 1 olduğunda bölenle XOR alın, sola kaydırın, tekrarlayın. Tüm ileti geçtikten sonra yazmaçta kalan şey CRC'dir. Tanımda anahtar veya tablo yok — yalnızca kalanlı bölme.
Beş parametre. İki sistem de “CRC-32” diyebilir ve yine de anlaşamayabilir, çünkü ad tek başına hiçbir şeyi sabitlemez. Tam tarif beş değer gerektirir: poly (bölen), init (yazmaç neyle başlar — hepsi sıfır, baştaki sıfır baytların kaybolmasına izin verir, hepsi bir değil), refin/refout (her girdi baytının — ve son yazmacın — bitlerinin ters çevrilip çevrilmediği, en düşük anlamlı bitten önce gönderen seri donanımın mirası) ve xorout (sondaki sıfırların dizisinin yanıtı yine de değiştirmesi için son bir XOR maskesi). Bu sayfa, tam da bu nedenle her sonucun yanında beşini de yazdırır.
Neden hataları tespit eder. İyi seçilmiş bir bölen, bir iletinin kalanını ve aynı iletinin birkaç biti çevrilmiş haldeki kalanını çok yüksek olasılıkla farklı kılar: iyi bir CRC-32, tüm 1 bitlik ve 2 bitlik hataları, tek sayıdaki tüm bit hatalarını ve 32 ardışık bozulmuş bite kadar her patlamayı yakalar — olasılıksal olarak değil, garanti edilmiş olarak. Bu garanti kazara bozulmayla ilgilidir ve CRC'leri gürültülü hatlar ve kararsız diskler için doğru araç yapan şeydir.
CRC ne değildir
Kriptografik karma değildir. Gizli bir anahtar ve tek yönlülük yoktur: parametreleri bilen herkes, dört düzeltici bayt ekleyerek, milisaniyeler içinde istediği CRC'ye sahip bir ileti üretebilir. CRC kazaları tespit eder, asla düşmanları değil. Yabancılara karşı doğruladığınız indirmeler için imzalar önemlidir — bunun yerine Özet Üretecine (MD5/SHA/BLAKE2) bakın. Bu sayfa, düşmanca ortamlar için MD5 ve SHA-1'in neden emekli edildiğini, SHA-256'nın ise neden ayakta kaldığını da açıklar.
Hata düzeltme kodu değildir. Bir CRC size bir şeyin değiştiğini söyler, neyin değiştiğini değil. Hataları anında onarmak, bir çözücünün tersine çevirebileceği fazlalık yapıyı kasıtlı olarak saklayan Reed–Solomon veya Hamming gibi kodların işidir.
Sıkıştırma veya şifreleme değildir. Kalan, girdi boyutundan bağımsız olarak birkaç bayttır ve ondan girdiyi geri kurtaramazsınız — ama kriptografik bir karmadan farklı olarak bu yalnızca bilgi atıldığı için böyledir, tersine çevirme zor olduğu için değil.
Bu sayfadaki aileler
CRC-32 dörtlüsü. Bu sayfanın dört girdisi aynı 0x04C11DB7 polinomunu paylaşır ama yine de farklı değerler üretir: ISO-HDLC (yansıtılmış, init/xorout tüm birler) zlib, gzip, PNG ve ZIP'in “asıl” CRC-32'sidir; BZIP2 yansıtılmamış aynı matematiktir; MPEG-2, son XOR'u olmayan BZIP2'dir; POSIX sıfırdan başlar ve cksum komutunun temelidir (ayrıca bölmeye dosya uzunluğunu ekler, bu yüzden bir dosyanın cksum'ı ile aynı baytların CRC-32/POSIX'i farklıdır). CRC-32C (Castagnoli, poly 0x1EDC6F41) beşinci kardeştir: daha iyi hata tespit performansı için seçilmiş farklı bir polinom ve modern x86 ve ARM işlemcilerin tek bir komutla bellek hızında hesaplayabildiği olan.
CRC-64 dörtlüsü. XZ, tüm birler init ve xorout ile yansıtılmış biçimde ECMA-182 polinomunu kullanır; ECMA-182 kendisi DLT-1 teyp standardından, yansıtılmamış sıfır-init özgün halidir; GO-ISO, Go'nun crc64.ISO'sudur, küçük bir poly 0x1B, hâlâ yansıtılmış; REDIS, karma-yuva ataması için iyi çığ etkisi amacıyla seçilmiş bir polinom kullanır. Altmış dört bit, CRC'lerin saf sağlama toplamları yerine karma fonksiyonları (kovalama) olarak kullanılmaya başladığı boyuttur.
Adler-32 dışarıdan gelendir: hiç bölme yapmaz. Baytları toplar (A, 1'den başlayarak) ve bu toplamların toplamını alır (B); ikisi de 65521 modunda, ardından iki 16 bitlik toplamı birleştirir. Yazılımda CRC-32'den hızlıdır ve zlib deflate akışları için kullanır — ama kısa girdilerde (birkaç yüz bayttan az) toplam çok az bilgi taşır; zlib'in küçük bloklar için CRC-32'ye geri dönmesinin nedeni tam olarak budur.
CRC-8 ve CRC-16, baytların pahalı olduğu yerlerde varlığını sürdürür: CRC-8/CCITT (poly 0x07) SMBus ve hücresel radyo protokollerinde tek başlık baytlarını korur; CRC-16/CCITT-FALSE akıllı kart bloklarını korur; CRC-16/MODBUS, dünya çapındaki fabrika katlarındaki her Modbus RTU çerçevesinin sağlama toplamıdır.
Her birinin kullanıldığı yer
| Parametre kümesi | Bulunduğu yer |
| CRC-32/ISO-HDLC | zlib, gzip, PNG, ZIP, Ethernet (FCS), birçok arşiv biçimi |
| CRC-32C | iSCSI, ext4, btrfs, ZFS, SSE4.2/ARMv8 donanım CRC32C komutu |
| CRC-32/BZIP2 | .bz2 arşiv akışı |
| CRC-32/MPEG-2 | MPEG-2 taşıma akışları |
| CRC-32/POSIX & cksum | POSIX cksum komut çıktısı (cksum file.txt) |
| CRC-16/MODBUS | Modbus RTU çerçeveleri (endüstriyel PLC'ler, sayaçlar, invertörler) |
| CRC-16/CCITT-FALSE | akıllı kartlar, X.25'e yakın hatlar, bazı GPS protokolleri |
| CRC-8/CCITT | SMBus (PEC baytı), hücresel radyo başlıkları |
| CRC-64/XZ | .xz kapsayıcı bütünlük denetimleri |
| CRC-64/ECMA-182 | ECMA-182 / DLT-1 teyp standardı |
| CRC-64/GO-ISO | Go standart kütüphanesi crc64.ISO |
| CRC-64/REDIS | Redis küme karma-yuva ataması |
| Adler-32 | zlib akışları (deflate), diğer hızlı sağlama toplamı bağlamları |
Referans tablosu — check(“123456789”)
CRC kataloğu geleneği, ASCII dizgisi 123456789 (9 bayt) için sonuç yayımlamaktır. Aşağıdaki her değer bu sayfada yeniden üretilebilir: Metin kutusuna 123456789 yazın, algoritmayı işaretleyin ve Hesaplayın'a tıklayın.
| Parametre kümesi | Genişlik | Denetim değeri (onaltılık) |
| CRC-8/CCITT | 8 | 0xf4 |
| CRC-16/CCITT-FALSE | 16 | 0x29b1 |
| CRC-16/MODBUS | 16 | 0x4b37 |
| CRC-32/ISO-HDLC | 32 | 0xcbf43926 |
| CRC-32C | 32 | 0xe3069283 |
| CRC-32/BZIP2 | 32 | 0xfc891918 |
| CRC-32/MPEG-2 | 32 | 0x0376e6e7 |
| CRC-32/POSIX | 32 | 0x765e7680 |
| cksum (POSIX command) | 32 | 0x377a6011 |
| CRC-64/XZ | 64 | 0x995dc9bbdf1939fa |
| CRC-64/ECMA-182 | 64 | 0x6c40df5f0b497347 |
| CRC-64/GO-ISO | 64 | 0xb90956c775a41001 |
| CRC-64/REDIS | 64 | 0xe9c6d914c4b8d9ca |
| Adler-32 | 32 | 0x091e01de |
Kaynaklar: her değer bağımsız bir bit düzeyinde referans uygulamasıyla ve, varsa, algoritmayı taşıyan sistem kütüphanesiyle (CRC-32 ve Adler-32 için zlib; diğerleri için Greg Cook CRC kataloğu) çapraz denetlenmiştir.
Yaygın hatalar
- Parametresiz “CRC-32”. ISO-HDLC, BZIP2, MPEG-2, POSIX ve CRC-32C arasında, aynı ad altında beş farklı değer dolaşır. Sonucu her zaman poly/init/refin/refout/xorout ile birlikte kaydedin — bu sayfa bunları sizin için yazdırır.
- Bir dosyanın CRC-32 değerini
cksum çıktısıyla karşılaştırmak. Farklı algoritmalar: cksum uzunluğu ekler ve farklı bir init kullanır. Sayılar eşleşmez ve ikisi de “doğrudur”.
- Kurcalamaya karşı CRC'ye güvenmek. Eşleşen bir CRC üretmek ders kitabı alıştırmasıdır (son 4 baytı yamalamak). Diğer taraf düşmanca olabilirse anahtarlı bir MAC (HMAC) veya imza kullanın.
- Çığ etkisi beklemek. CRC doğrusaldır: ilişkili iletiler ilişkili CRC'ler verir. Gürültü için uygundur, karma için yanlıştır — kovalama gerekiyorsa CRC-64 veya gerçek bir karma, CRC-32'den daha güvenlidir.
- Onaltılık metin ile baytlar.
"123456789" dizgisi (9 ASCII bayt, 31 32 33 34 35 36 37 38 39) ile 0x123456789 sayısı farklı girdilerdir ve farklı CRC'lere sahiptir. Kaynak verileriniz gerçekten ikili olduğunda Onaltılık bayt sekmesini kullanın.
SSS
CRC-32'im neden ZIP dosyasındaki değerle eşleşmiyor? ZIP'in CRC-32'si, sıkıştırılmamış veri üzerinde ISO-HDLC'dir. Aynı baytları (sıkıştırılmış akışı değil), aynı kipi (Metin veya Onaltılık) ve aynı parametre kümesini karma yaptığınızdan emin olun — her sonucun altında yazdırılan parametre satırı bu denetimi anında yapmak içindir.
CRC-32C mi yoksa CRC-32 mi daha iyi? Kazara hata tespiti için ikisi de 32 bite kadar tüm patlamaları yakalar; CRC-32C bazı hata örüntülerinde daha iyi performans gösterir ve CPU komutlarına sahip olandır — gigabit hızlarında pratikte bedavadır. CRC-32/ISO-HDLC'nin hayatta kalmasının nedeni uyumluluktur: otuz yıllık arşivler bunu konuşur.
CRC-64, CRC-32'den daha mı güçlü? Daha uzun patlamaları (64 bite kadar) tespit eder ve kovalama için kullanıldığında çok daha az çakışır, ama yine de sahte üretilebilir — genişlik tespit garantileri sağlar, güvenlik sağlamaz.
Bir CRC, girdiyi ortaya çıkarmak için tersine çevrilebilir mi? Hayır — sonsuz sayıda girdi aynı CRC'yi paylaşır. Ama kriptografik bir karmadan farklı olarak, bir saldırgan seçtiği herhangi bir CRC'ye sahip bir girdi oluşturabilir; tek yönlü olmamasının anlamı budur.