什麼是 CRC 校驗碼?
循環冗餘檢查(Cyclic Redundancy Check,簡稱 CRC)是一種偵錯碼,廣泛應用在網路傳輸、儲存裝置與各種檔案格式中(例如 Ethernet、ZIP、PNG、Modbus、USB 等)。它會把你的資料視為一個很長的二進位數字,再用一個固定的生成多項式,以「無進位」的二進位運算(也就是 GF(2),其中加法與減法都等同於 XOR)去做除法,所得到的餘數就是 CRC 值。只要訊息中有任何一個位元改變,餘數幾乎一定也會跟著改變,這正是 CRC 能夠有效偵測傳輸與儲存錯誤的關鍵。
計算器使用說明
在輸入框中輸入任意 ASCII 文字,選擇你需要的 CRC 變體,即可看到結果。本工具會同時以十六進位與十進位顯示校驗碼,並附上位元寬度與所處理的位元組數。目前支援三種常見的變體:
CRC-8 — 多項式 \(\mathtt{0x07}\),初始值 \(\mathtt{0x00}\)。
CRC-16/CCITT-FALSE — 多項式 \(\mathtt{0x1021}\),初始值 \(\mathtt{0xFFFF}\),不做位元反射。
CRC-32(IEEE 802.3) — 反射多項式 \(\mathtt{0xEDB88320}\),初始值 \(\mathtt{0xFFFFFFFF}\),最終 XOR \(\mathtt{0xFFFFFFFF}\)。這也是 ZIP、gzip 與 Ethernet 所採用的變體。
公式原理說明
就觀念上來說,訊息 \(M(x)\) 會先乘以 \(x^n\)(\(n\) 為生成多項式的次數),再除以 \(G(x)\)。實作上,我們會使用一個暫存器,每次位移一個位元,並在最高位元為 1 時 XOR 上多項式。至於反射型變體(例如 CRC-32),則是從最低有效位元開始處理,並改為向右位移而非向左。
$$\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.$$
實際範例
以經典的檢查字串 123456789 為例:CRC-16/CCITT-FALSE 的結果為 0x29B1(十進位 10673),而 CRC-32/IEEE 的結果為 0xCBF43926(十進位 3421780262)。這些都是 CRC 參考目錄中公布的標準「check」值,你可以拿它們來驗證任何實作是否正確。
常見問題
為什麼我的結果跟其他工具不一樣?不同 CRC 變體在多項式、初始值、位元反射與最終 XOR 上都有差異。請確認你比較的是完全相同的變體。
CRC 算是安全的雜湊嗎?不算。CRC 能偵測偶發的錯誤,但要刻意偽造卻非常容易。若有資安需求,請改用 SHA-256 之類的演算法。
使用哪一種編碼?計算 CRC 前,每個字元都會以其 8 位元的 ASCII/Latin-1 位元組值來處理。