CRC checksum là gì?
CRC (Cyclic Redundancy Check — kiểm tra dư vòng) là một mã phát hiện lỗi được dùng rộng rãi trong mạng máy tính, lưu trữ dữ liệu và nhiều định dạng tệp (Ethernet, ZIP, PNG, Modbus, USB và nhiều chuẩn khác). Nó coi dữ liệu của bạn như một số nhị phân rất dài rồi đem chia cho một đa thức sinh cố định bằng phép tính nhị phân không nhớ (trên trường GF(2), nơi phép cộng và phép trừ đều chính là phép XOR). Phần dư của phép chia đó chính là giá trị CRC. Chỉ cần một bit duy nhất trong thông điệp thay đổi, phần dư gần như chắc chắn cũng thay đổi theo — đây chính là lý do CRC cực kỳ hiệu quả trong việc phát hiện lỗi truyền và lỗi lưu trữ.
Cách dùng công cụ này
Bạn chỉ cần gõ một đoạn văn bản ASCII bất kỳ vào ô nhập, chọn biến thể CRC cần dùng và xem kết quả. Công cụ trả về giá trị checksum ở cả hệ thập lục phân (hex) lẫn hệ thập phân, kèm theo độ rộng bit và số byte đã xử lý. Hiện công cụ hỗ trợ ba biến thể phổ biến:
CRC-8 — đa thức \(\mathtt{0x07}\), giá trị khởi tạo \(\mathtt{0x00}\).
CRC-16/CCITT-FALSE — đa thức \(\mathtt{0x1021}\), giá trị khởi tạo \(\mathtt{0xFFFF}\), không đảo bit.
CRC-32 (IEEE 802.3) — đa thức đảo \(\mathtt{0xEDB88320}\), khởi tạo \(\mathtt{0xFFFFFFFF}\), XOR cuối \(\mathtt{0xFFFFFFFF}\). Đây chính là biến thể được ZIP, gzip và Ethernet sử dụng.
Giải thích công thức
Về mặt lý thuyết, thông điệp \(M(x)\) được nhân với \(x^n\) (trong đó \(n\) là bậc của đa thức sinh) rồi chia cho \(G(x)\). Trên thực tế, ta dùng một thanh ghi và dịch nó từng bit một, thực hiện phép XOR với đa thức mỗi khi bit dẫn đầu bằng 1. Các biến thể đảo bit (như CRC-32) xử lý bit theo thứ tự bit ít quan trọng nhất trước và dịch sang phải thay vì sang trái.
$$\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.$$
Ví dụ minh họa
Với chuỗi kiểm tra kinh điển 123456789: CRC-16/CCITT-FALSE cho kết quả 0x29B1 (thập phân \(10673\)), còn CRC-32/IEEE cho kết quả 0xCBF43926 (thập phân \(3421780262\)). Đây là những giá trị "check" tiêu chuẩn được công bố trong các danh mục tham chiếu CRC, nên bạn có thể dùng chúng để đối chiếu và kiểm chứng bất kỳ cách triển khai nào.
Câu hỏi thường gặp
Vì sao kết quả của tôi khác với công cụ khác? Các biến thể CRC khác nhau ở đa thức, giá trị khởi tạo, cách đảo bit và phép XOR cuối. Hãy chắc chắn rằng bạn đang so sánh đúng cùng một biến thể.
CRC có phải là một hàm băm bảo mật không? Không. CRC chỉ phát hiện lỗi ngẫu nhiên, nhưng cực kỳ dễ bị làm giả một cách có chủ đích. Để bảo mật, hãy dùng SHA-256 hoặc các hàm tương đương.
Công cụ dùng bảng mã gì? Mỗi ký tự được lấy theo giá trị byte 8 bit ASCII/Latin-1 của nó trước khi tính CRC.