Baris menggunakan bentuk "ALGORITMA nilai" yang diikuti baris parameter yang menjorok, sehingga hasil yang disalin-tempel selalu menyebutkan set parameter yang menghasilkannya.
CRC — cyclic redundancy check, dijelaskan dari dasar
Dalam satu kalimat: CRC memperlakukan data Anda sebagai satu bilangan biner raksasa, membaginya dengan bilangan “generator” yang tetap menggunakan XOR alih-alih pengurangan, dan melaporkan sisanya — sidik jari ringkas yang berubah drastis ketika satu bit input saja terbalik, itulah sebabnya segala hal dari file PNG hingga kabel Modbus membawanya.
Apa sebenarnya CRC itu
Gambaran pembagian. Susun byte Anda sebagai satu bilangan biner panjang. Pilih pembagi — polinomial, mis. 0x04C11DB7 untuk CRC-32. Lakukan pembagian panjang biner, di mana "pengurangan" adalah operasi XOR: setiap kali bit terdepan dari sisa berjalan adalah 1, XOR dengan pembagi, geser ke kiri, ulangi. Setelah seluruh pesan dilalui, apa pun yang tertinggal di register adalah CRC. Tidak ada kunci, tidak ada tabel dalam definisinya — hanya pembagian dengan sisa.
Lima parameter. Dua sistem dapat sama-sama mengatakan "CRC-32" dan tetap berbeda, karena nama saja tidak menetapkan apa pun. Resep lengkap memerlukan lima nilai: poly (pembagi), init (keadaan awal register — semua nol membuat byte nol di depan lenyap, semua satu tidak), refin/refout (apakah setiap byte input — dan register akhir — dibalik bitnya, warisan perangkat keras serial yang mengirim bit paling tidak signifikan lebih dulu), dan xorout (topeng XOR akhir sehingga deretan nol di akhir tetap mengubah jawaban). Halaman ini mencetak kelimanya di samping setiap hasil persis untuk alasan itu.
Mengapa ia mendeteksi kesalahan. Pembagi yang dipilih dengan baik membuat sisa sebuah pesan dan sisa pesan yang sama dengan beberapa bit terbalik berbeda dengan probabilitas yang sangat tinggi: CRC-32 yang baik menangkap semua kesalahan 1-bit dan 2-bit, semua jumlah ganjil kesalahan bit, dan setiap burst hingga 32 bit berturut-turut yang rusak — dijamin, bukan secara probabilistik. Jaminan itu berkaitan dengan kerusakan tidak disengaja, dan itulah yang menjadikan CRC alat yang tepat untuk kabel berderau dan disk yang tidak stabil.
Apa yang bukan CRC
Bukan hash kriptografis. Tidak ada rahasia dan tidak ada sifat satu arah: siapa pun yang mengetahui parameternya dapat memalsukan pesan dengan CRC apa pun yang disukainya, dalam milidetik, dengan menambahkan empat byte koreksi. CRC mendeteksi kecelakaan, tidak pernah musuh. Untuk unduhan yang diverifikasi terhadap pihak asing, tanda tangan itu penting — lihat Generator Hash (MD5/SHA/BLAKE2) sebagai gantinya. Halaman itu juga menjelaskan mengapa MD5 dan SHA-1 dipensiunkan untuk pengaturan yang bermusuhan sementara SHA-256 tetap bertahan.
Bukan kode koreksi kesalahan. CRC memberi tahu Anda bahwa sesuatu berubah, bukan apa yang berubah. Memperbaiki kesalahan secara langsung adalah tugas kode seperti Reed–Solomon atau Hamming, yang dengan sengaja menyimpan struktur berlebih yang dapat dibalik oleh decoder.
Bukan kompresi atau enkripsi. Sisanya hanya beberapa byte terlepas dari ukuran input, dan dari situ input tidak dapat dipulihkan — tetapi tidak seperti hash kriptografis, itu hanya karena informasi telah dibuang, bukan karena pembalikannya sulit.
Keluarga-keluarga di halaman ini
Tiga serangkai CRC-32. Empat entri di halaman ini berbagi poli 0x04C11DB7 dan tetap menghasilkan nilai yang berbeda: ISO-HDLC (tercermin, init/xorout semua satu) adalah CRC-32 "yang" dari zlib, gzip, PNG, dan ZIP; BZIP2 adalah matematika yang sama tanpa cermin; MPEG-2 adalah BZIP2 tanpa XOR akhir; POSIX dimulai dari nol dan menjadi dasar perintah cksum (yang selain itu menambahkan panjang file ke pembagian, sehingga cksum sebuah file dan CRC-32/POSIX dari byte yang sama berbeda). CRC-32C (Castagnoli, poli 0x1EDC6F41) adalah saudara kelima: poli berbeda yang dipilih untuk kinerja deteksi kesalahan yang lebih baik, dan yang dapat dihitung CPU x86 dan ARM modern pada kecepatan memori dengan satu instruksi.
Empat serangkai CRC-64. XZ menggunakan polinomial ECMA-182 dalam bentuk tercermin dengan init semua satu dan xorout; ECMA-182 sendiri adalah asli tak-tercermin dengan init nol dari standar pita DLT-1; GO-ISO adalah crc64.ISO milik Go, dengan poli kecil 0x1B, tetap tercermin; REDIS memakai poli yang dipilih untuk avalanche yang baik dalam penetapan slot hash. Enam puluh empat bit adalah ukuran di mana CRC mulai dipakai sebagai fungsi hash (bucketing) alih-alih checksum murni.
Adler-32 adalah orang luar: ia sama sekali bukan pembagian. Ia menjumlahkan byte (A, dimulai dari 1) dan menjumlahkan jumlah-jumlah itu (B), keduanya modulo 65521, lalu menggabungkan kedua jumlah 16-bit tersebut. Ia lebih cepat daripada CRC-32 di perangkat lunak dan zlib memakainya untuk aliran deflate — namun untuk input pendek (di bawah beberapa ratus byte) jumlahnya membawa terlalu sedikit informasi, itulah sebabnya zlib kembali ke CRC-32 untuk blok kecil.
CRC-8 dan CRC-16 bertahan di tempat byte mahal: CRC-8/CCITT (poli 0x07) melindungi byte header tunggal dalam protokol SMBus dan radio seluler; CRC-16/CCITT-FALSE menjaga blok kartu pintar; CRC-16/MODBUS adalah checksum setiap bingkai Modbus RTU di lantai pabrik di seluruh dunia.
Tempat setiap algoritma digunakan
| Set parameter | Ditemukan di |
| CRC-32/ISO-HDLC | zlib, gzip, PNG, ZIP, Ethernet (FCS), banyak format arsip |
| CRC-32C | iSCSI, ext4, btrfs, ZFS, instruksi perangkat keras CRC32C SSE4.2/ARMv8 |
| CRC-32/BZIP2 | Aliran arsip .bz2 |
| CRC-32/MPEG-2 | Aliran transport MPEG-2 |
| CRC-32/POSIX & cksum | Keluaran perintah POSIX cksum (cksum file.txt) |
| CRC-16/MODBUS | Bingkai Modbus RTU (PLC industri, meter, inverter) |
| CRC-16/CCITT-FALSE | kartu pintar, tautan dekat X.25, beberapa protokol GPS |
| CRC-8/CCITT | SMBus (byte PEC), header radio seluler |
| CRC-64/XZ | Pemeriksaan integritas kontainer .xz |
| CRC-64/ECMA-182 | ECMA-182 / standar pita DLT-1 |
| CRC-64/GO-ISO | Pustaka standar Go crc64.ISO |
| CRC-64/REDIS | Penetapan slot hash klaster Redis |
| Adler-32 | Aliran zlib (deflate), konteks checksum cepat lainnya |
Tabel jangkar — check(“123456789”)
Konvensi katalog CRC adalah mempublikasikan hasil untuk string ASCII 123456789 (9 byte). Setiap nilai di bawah dapat direproduksi di halaman ini: ketik 123456789 di kotak Teks, centang algoritmanya, lalu klik Hitung.
| Set parameter | Lebar | Nilai pemeriksaan (hex) |
| 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 |
Sumber: setiap nilai diperiksa silang dengan implementasi referensi bitwise yang independen dan, bila ada, dengan pustaka sistem yang memuat algoritmanya (zlib untuk CRC-32 dan Adler-32; katalog CRC Greg Cook untuk sisanya).
Kesalahan umum
- “CRC-32” tanpa parameter. Di antara ISO-HDLC, BZIP2, MPEG-2, POSIX, dan CRC-32C, lima nilai berbeda beredar di bawah nama yang sama. Selalu catat poly/init/refin/refout/xorout bersama hasilnya — halaman ini mencetaknya untuk Anda.
- Membandingkan CRC-32 sebuah file dengan keluaran
cksum-nya. Algoritmanya berbeda: cksum menambahkan panjang dan menggunakan init yang berbeda. Angkanya tidak akan cocok, dan keduanya "benar".
- Mempercayai CRC terhadap manipulasi. Memalsukan CRC yang cocok adalah latihan buku teks (menambal 4 byte terakhir). Gunakan MAC berkunci (HMAC) atau tanda tangan ketika pihak lain mungkin bermusuhan.
- Mengharapkan efek avalanche. CRC bersifat linear: pesan yang berkaitan menghasilkan CRC yang berkaitan. Cocok untuk derau, salah untuk hashing — jika Anda memerlukan bucketing, CRC-64 atau hash sungguhan lebih aman daripada CRC-32.
- Teks hex vs byte. String
"123456789" (9 byte ASCII, 31 32 33 34 35 36 37 38 39) dan angka 0x123456789 adalah input yang berbeda dengan CRC yang berbeda. Gunakan tab Byte Hex ketika data sumber benar-benar biner.
FAQ
Mengapa CRC-32 Anda tidak cocok dengan yang ada di file ZIP? CRC-32 ZIP adalah ISO-HDLC atas data yang tidak dikompresi. Pastikan Anda meng-hash byte yang sama (bukan aliran terkompresi), mode yang sama (Teks vs Hex), dan set parameter yang sama — baris parameter yang dicetak di bawah setiap hasil ada untuk membuat pemeriksaan itu instan.
Mana yang lebih baik, CRC-32C atau CRC-32? Untuk deteksi kesalahan yang tidak disengaja keduanya menangkap semua burst hingga 32 bit; CRC-32C berkinerja lebih baik pada beberapa pola kesalahan dan merupakan yang memiliki instruksi CPU — praktis gratis pada kecepatan gigabit. Alasan CRC-32/ISO-HDLC bertahan adalah kompatibilitas: tiga puluh tahun arsip menggunakannya.
Apakah CRC-64 lebih kuat daripada CRC-32? Ia mendeteksi burst yang lebih panjang (hingga 64 bit) dan bertabrakan jauh lebih sedikit ketika dipakai untuk bucketing, tetapi sama mudahnya dipalsukan — lebar memberi jaminan deteksi, bukan keamanan.
Dapatkah CRC dibalik untuk mengungkap input? Tidak — tak terhingga banyaknya input berbagi CRC yang sama. Tetapi tidak seperti hash kriptografis, penyerang dapat membangun input dengan CRC apa pun yang diinginkan, dan itulah arti mengapa ia sama sekali tidak searah.