Remove ads
来自维基百科,自由的百科全书
循環冗餘校驗(英語:Cyclic redundancy check,通稱「CRC」)是一種根據網路數據封包或電腦檔案等數據產生簡短固定位數驗證碼的一種散列函數,主要用來檢測或校驗數據傳輸或者保存後可能出現的錯誤。生成的數字在傳輸或者儲存之前計算出來並且附加到數據後面,然後接收方進行檢驗確定數據是否發生變化。由於本函數易於用二進制的電腦硬件使用、容易進行數學分析並且尤其善於檢測傳輸通道干擾引起的錯誤,因此獲得廣泛應用。此方法是由W. Wesley Peterson於1961年發表[1]。
CRCs經常被叫做「校驗和」,但是這樣的說法嚴格來說並不是準確的,因為技術上來說,校驗「和」是通過加法來計算的,而不是CRC這裡的除法。
「糾錯碼」(Error–Correcting Codes,簡稱ECC)常常和CRCs緊密相關,其語序糾正在傳輸過程中所產生的錯誤。這些編碼方式常常和數學原理緊密相關。例如常見於通訊或資訊傳遞上BCH碼、前向錯誤更正、錯誤檢測與糾正等。
CRC是兩個字節數據流採用二進制除法(沒有進位,使用XOR來代替減法)相除所得到的餘數。其中被除數是需要計算校驗和的信息數據流的二進制表示;除數是一個長度為的預定義(短)的二進制數,通常用多項式的系數來表示。在做除法之前,要在信息數據之後先加上個0。
CRC是基於有限域GF(2)(即除以2的同餘)的多項式環。簡單的來說,就是所有系數都為0或1(又叫做二進制)的多項式系數的集合,並且集合對於所有的代數操作都是封閉的。例如:
2會變成0,因為對系數的加法運算都會再取2的模數。乘法也是類似的:
同樣可以對多項式作除法並且得到商和餘數。例如,如果用x3 + x2 + x除以x + 1。會得到:
也就是說,
等價於:
這裡除法得到了商x2 + 1和餘數-1,因為是奇數所以最後一位是1。
字符串中的每一位其實就對應了這樣類型的多項式的系數。為了得到CRC,首先將其乘以,這裡是一個固定多項式的階數,然後再將其除以這個固定的多項式,餘數的系數就是CRC。
在上面的等式中,表示了本來的信息位是111
, 是所謂的鑰匙,而餘數(也就是)就是CRC. key的最高次為1,所以將原來的信息乘上來得到,也可視為原來的信息位補1個零成為1110
。
一般來說,其形式為:
這裡M(x)是原始的信息多項式。K(x)是階的「鑰匙」多項式。表示了將原始信息後面加上個0。R(x)是餘數多項式,即是CRC「校驗和」。在通訊中,發送者在原始的信息數據M後附加上位的R(替換本來附加的0)再發送。接收者收到M和R後,檢查是否能被整除。如果是,那麼接收者認為該信息是正確的。值得注意的是就是發送者所想要發送的數據。這個串又叫做codeword.
CRC有幾種不同的變體:
shiftRegister
可以逆向使用,這樣就需要檢測最低位的值,每次向右移動一位。這就要求polynomial
生成逆向的數據位結果。實際上這是最常用的一個變體。按照慣例,使用CRC-32多項式以及CRC-16-CCITT多項式時通常都要取反。CRC-32的核驗多項式是
。
例:
,這裡可知
因,故L(x)階數從2開始
用求得一組n個1及m個0以便與相加
令m = 5,(bitwise shift)
(使M前置的0變成1)
用 mod2 求得餘R(x)= 011
送出
接收端L(x) = 111且開頭不為1 => m = 5
可反推
用10011011 mod2 1101可驗證能被K(x)整除。
CRC的錯誤檢測能力依賴於關鍵多項式的階次以及所使用的特定關鍵多項式。誤碼多項式是接收到的消息碼字與正確消息碼字的異或結果。當且僅當誤碼多項式能夠被CRC多項式整除的時候CRC算法無法檢查到錯誤。
。
如上所述,不能被CRC多項式整除,它得到一個項。根據定義,滿足多項式整除的最小值就是多項式的階次。最高階次的多項式是本原多項式,帶有二進制系數的階多項式
下面的表格略去了「初始值」、「反射值」以及「最終異或值」。
CRC標準化問題
名稱 | 多項式 | 表示法:正常或者翻轉 |
---|---|---|
CRC-1 | (用途:硬件,也稱為奇偶校驗位) |
0x1 or 0x1 (0x1) |
CRC-5-CCITT | (ITU G.704標準) | 0xB(0x??) |
CRC-5-USB | (用途:USB信令包) | 0x5 or 0x14 (0x9) |
CRC-7 | (用途:通信系統) | 0x9 or 0x48 (0x11) |
CRC-8-ATM | (用途:ATM HEC, PMBUS (參見SMBUS org[1] (頁面存檔備份,存於網際網路檔案館))) | 0x7或0xE0 (0xC1) |
CRC-8-CCITT | (用途:1-Wire 總線) | 0x8D |
CRC-8-Dallas/Maxim | (用途:1-Wire bus) | 0x31或0x8C |
CRC-8 | 0xD5(0x??) | |
CRC-10 | 0x233(0x????) | |
CRC-12 | (用途:通信系統) | 0x80F或0xF01 (0xE03) |
CRC-16-Fletcher | 參見Fletcher's checksum | 用於Adler-32 A & B CRC |
CRC-16-CCITT | (X25, V.41, Bluetooth, PPP, IrDA) | 0x1021或0x8408 (0x0811) |
CRC-16-IBM | (用途:Modbus) | 0x8005或0xA001 (0x4003) |
CRC-16-BBS | (用途:XMODEM協議) | 0x8408(0x????) |
CRC-32-Adler | 參見Adler-32 | 參見Adler-32 |
CRC-32-MPEG2 | 參見IEEE 802.3 | 參見IEEE 802.3 |
CRC-32-IEEE 802.3 | 0x04C11DB7或0xEDB88320 (0xDB710641) | |
CRC-32C(Castagnoli) | 0x1EDC6F41或0x82F63B78 (0x05EC76F1) | |
CRC-64-ISO | (用途: ISO 3309) |
0x000000000000001B或0xD800000000000000 (0xB000000000000001) |
CRC-64-ECMA-182 | (參見ECMA-182 (頁面存檔備份,存於網際網路檔案館) p.63) |
0x42F0E1EBA9EA3693或0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85) |
CRC-128 | IEEE-ITU標準。被MD5 & SHA-1取代 | |
CRC-160 | IEEE-ITU標準。被MD5 & SHA-1取代 |
儘管在錯誤檢測中非常有用,CRC並不能可靠地驗證數據完整性(即數據沒有發生任何變化),這是因為CRC多項式是線性結構,可以非常容易地故意改變數據而維持CRC不變,參見CRC and how to Reverse it (頁面存檔備份,存於網際網路檔案館)中的證明。可以用訊息鑑別碼驗證數據完整性。
與所有其它的散列函數一樣,在一定次數的碰撞測試之後CRC也會接近100%出現碰撞。CRC中每增加一個數據位,碰撞機率就會減少接近50%,如CRC-20與CRC-21相比。
生成多項式的選擇是CRC算法實現中最重要的部分,所選擇的多項式必須有最大的錯誤檢測能力,同時保證總體的碰撞概率最小。多項式最重要的屬性是它的長度,也就是最高非零系數的數值,因為它直接影響著計算的校驗和的長度。
最常用的多項式長度有
在構建一個新的CRC多項式或者改進現有的CRC時,一個通用的數學原則是使用滿足所有模運算不可分解多項式約束條件的多項式。
生成多項式的特性可以從算法的定義中推導出來:
總的分類
特殊技術參考
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.