循环冗余校验

title: 简介.
content: CRC为校验和的一种,是两个字节数据流采用二进制除法(没有进制,使用XOR来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为formula_1的预定义(短)的二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上formula_2个0.  CRC是基于有限域GF(2)(即除以2的同余)的多项式环。简单的来说,就是所有系数都为0或1(又叫做二进制)的多项式系数的集合,并且集合对于所有的代数操作都是封闭的。例如:  2会变成0,因为对系数的加法运算都会再取2的模数。乘法也是类似的:  我们同样可以对多项式作除法并且得到商和余数。例如,如果我们用"x" + "x" + "x"除以"x" + 1。我们会得到: 也就是说,  等价于:  这里除法得到了商"x" + 1和余数-1,因为是奇数所以最后一位是1。  字符串中的每一位其实就对应了这样类型的多项式的系数。为了得到CRC,我们首先将其乘以formula_8,这里formula_2是一个固定多项式的阶数,然后再将其除以这个固定的多项式,余数的系数就是CRC。  在上面的等式中,formula_10表示了本来的信息位是codice_1, formula_11是所谓的钥匙,而余数formula_12(也就是formula_13)就是CRC. key的最高次为1,所以我们将原来的信息乘上formula_14来得到formula_15,也可视为原来的信息位补1个零成为codice_2。  一般来说,其形式为:  这里M(x)是原始的信息多项式。K(x)是formula_2阶的「钥匙」多项式。formula_18表示了将原始信息后面加上formula_2个0。R(x)是余数多项式,即是CRC「校验和」。在通讯中,发送者在原始的信息数据M后附加上formula_2位的R(替换本来附加的0)再发送。接收者收到M和R后,检查formula_21是否能被formula_22整除。如果是,那么接收者认为该信息是正确的。值得注意的是formula_21就是发送者所想要发送的数据。这个串又叫做"codeword".  CRCs经常被叫做「校验和」,但是这样的说法严格来说并不是准确的,因为技术上来说,校验「和」是通过加法来计算的,而不是CRC这里的除法。  「纠错码」常常和CRCs紧密相关,其语序纠正在传输过程中所产生的错误。这些编码方式常常和数学原理紧密相关。例如常见于通讯或资讯传递上BCH码、前向错误更正、错误检测与纠正等。
title: 变体.
content: CRC有几种不同的变体  按照惯例,使用CRC-32多项式以及CRC-16-CCITT多项式时通常都要取反。CRC-32的核验多项式是<br> formula_30。  formula_33<BR>formula_34formula_35<BR>formula_36<BR> 例: formula_37<br> formula_38,这里可知formula_39<br> formula_40<br> 因formula_41,formula_39故L(x)阶数从2开始<br> formula_43<br> 用formula_44求得一组n个1及m个0以便与formula_32相加<br> 令m = 5,formula_46(bitwise shift)<br> formula_47(使M前置的0变成1)<br> 用formula_48 mod2 formula_22求得余R(x)= 011<br> formula_50送出<BR> 接收端L(x) = 111且开头不为1 => m = 5 <BR> 可反推formula_51<BR> 用10011011 mod2 1101可验证能被K(x)整除。
title: 错误检测能力.
content: CRC的错误检测能力依赖于关键多项式的阶次以及所使用的特定关键多项式。"误码多项式"formula_52是接收到的消息码字与正确消息码字的"异或"结果。当且仅当误码多项式能够被CRC多项式整除的时候CRC算法无法检查到错误。 formula_57。 如上所述,formula_53不能被CRC多项式整除,它得到一个formula_59项。根据定义,满足多项式整除formula_59的formula_61最小值就是多项式的阶次。最高阶次的多项式是本原多项式,带有二进制系数的formula_2阶多项式
title: CRC多项式规范.
content: 下面的表格略去了「初始值」、「反射值」以及「最终异或值」。  CRC标准化问题
title: CRC与数据完整性.
content: 尽管在错误检测中非常有用,CRC并不能可靠地验证数据完整性(即数据没有发生任何变化),这是因为CRC多项式是线性结构,可以非常容易地"故意"改变量据而维持CRC不变,参见CRC and how to Reverse it中的证明。我们可以用Message authentication code验证数据完整性。
title: CRC发生碰撞的情况.
content: 与所有其它的散列函数一样,在一定次数的碰撞测试之后CRC也会接近100%出现碰撞。CRC中每增加一个数据位,碰撞几率就会减少接近50%,如CRC-20与CRC-21相比。
title: 设计CRC多项式.
content: 生成多项式的选择是CRC算法实现中最重要的部分,所选择的多项式必须有最大的错误检测能力,同时保证总体的碰撞概率最小。多项式最重要的属性是它的长度,也就是最高非零系数的数值,因为它直接影响着计算的校验和的长度。  最常用的多项式长度有  在构建一个新的CRC多项式或者改进现有的CRC时,一个通用的数学原则是使用满足所有模运算不可分解多项式约束条件的多项式。  生成多项式的特性可以从算法的定义中推导出来:
title: 参见.
content: 总的分类  特殊技术参考

Summary: 循环冗余校验(英语:Cyclic redundancy check,通称「CRC」)是一种根据网络数据封包或电脑档案等数据产生简短固定位数验证码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者储存之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。由于本函数易于用二进制的电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。此方法是由W. Wesley Peterson于1961年发表。

Cyclic redundancy check: A cyclic redundancy check (CRC) is an error-detecting code commonly used in digital networks and storage devices to detect accidental changes to raw data. Blocks of data entering these systems get a short "check value" attached, based on the remainder of a polynomial division of their contents. On retrieval, the calculation is repeated and, in the event the check values do not match, corrective action can be taken against data corruption. CRCs can be used for error correction (see bitfilters).