循环冗余校验

66 篇文章 0 订阅

循环冗余校验


循环冗余校验英语Cyclic redundancy check,通称“ CRC”)是一种根据网络数据分组或 电脑文件等数据产生简短固定位数校验码的一种 散列函數,主要用来检测或校验数据传输或者保存后可能出现的错误。生成的数字在传输或者存储之前计算出来并且附加到数据后面,然后接收方进行检验确定数据是否发生变化。一般来说,循环冗余校验的值都是32位的整数。由于本函数易于用二进制的 电脑硬件使用、容易进行数学分析并且尤其善于检测传输通道干扰引起的错误,因此获得广泛应用。它是由 W. Wesley Peterson在他1961年发表的论文中披露 [1]

简介

CRC为校验和的一种,是两个字节数据流采用二进制除法(没有进位,使用XOR来代替减法)相除所得到的余数。其中被除数是需要计算校验和的信息数据流的二进制表示;除数是一个长度为n+1的预定义(短)的二进制数,通常用多项式的系数来表示。在做除法之前,要在信息数据之后先加上n个0.

CRCa 是基于有限域 GF(2) (即除以2的同余)的多项式环。简单的来说,就是所有系数都为0或1(又叫做二进制)的多项式系数的集合,并且集合对于所有的代数操作都是封闭的。例如:

(x^3 + x) + (x + 1) = x^3 + 2x + 1 \equiv x^3 + 1

2会变成0,因为对系数的加法运算都会再取2的模数. 乘法也是类似的:

(x^2 + x)(x + 1) = x^3 + 2x^2 + x \equiv x^3 + x

我们同样可以对多项式作除法并且得到商和余数。例如, 如果我们用x3 + x2 + x除以x + 1。我们会得到:

\frac{(x^3 + x^2 + x)}{(x+1)} = (x^2 + 1) - \frac{1}{(x+1)}

也就是说,

(x^3 + x^2 + x) = (x^2 + 1)(x + 1) - 1

等价于:

(x^2 + x + 1)x = (x^2 + 1)(x + 1) - 1

这里除法得到了商x2 + 1和余数-1,因为是奇数所以最后一位是1。

字符串中的每一位其实就对应了这样类型的多项式的系数。为了得到CRC, 我们首先将其乘以x^{n},这里n是一个固定多项式的阶数, 然后再将其除以这个固定的多项式,余数的系数就是CRC。

在上面的等式中,x^2+x+1表示了本来的信息位是111, x+1是所谓的钥匙, 而余数1(也就是x^0)就是CRC. key的最高次为1, 所以我们将原来的信息乘上x^1来得到x^3 + x^2 + x,也可视为原来的信息位补1个零成为1110

一般来说,其形式为:

M(x) \cdot x^{n} = Q(x) \cdot K(x) - R (x)

这里 M(x) 是原始的信息多项式。K(x)是n阶的“钥匙”多项式。M(x) \cdot x^{n}表示了将原始信息后面加上n个0。R(x)是余数多项式,即是CRC“校验和”。在通信中,发送者在原始的信息数据M后附加上n位的R(替换本来附加的0)再发送。接收者收到M和R后,检查M(x) \cdot x^{n} + R(x)是否能被K(x)整除。如果是,那么接收者认为该信息是正确的。值得注意的是M(x) \cdot x^{n} + R(x)就是发送者所想要发送的数据。这个串又叫做codeword.

CRCs 经常被叫做“校验和”, 但是这样的说法严格来说并不是准确的,因为技术上来说,校验“和”是通过加法来计算的,而不是CRC这里的除法。

错误纠正编码”常常和CRCs紧密相关,其语序纠正在传输过程中所产生的错误。这些编码方式常常和数学原理紧密相关。

实现

变体

CRC 有几种不同的变体

  • shiftRegister 可以逆向使用,这样就需要检测最低位的值,每次向右移动一位。这就要求 polynomial 生成逆向的数据位结果。实际上这是最常用的一个变体。
  • 可以先将数据最高位读到移位寄存器,也可以先读最低位。在通信协议中,为了保留 CRC 的突发错误检测特性,通常按照物理层发送数据位的方式计算 CRC。
  • 为了检查 CRC,需要在全部的码字上进行 CRC 计算,而不是仅仅计算消息(Message)的 CRC 并把它与 CRC 比较。如果结果是 0,那么就通过这项检查。这是因为码字 M(x) \cdot x^{n} + R(x) = Q(x) \cdot K(x) 可以被 K(x) 整除。
  • 移位寄存器可以初始化成 1 而不是 0。同样,在用算法处理之前,消息的最初 n 个数据位要取反。这是因为未经修改的 CRC 无法区分只有起始 0 的个数不同的两条消息。而经过这样的取反过程,CRC 就可以正确地分辨这些消息了。
  • CRC 在附加到消息数据流(Message stream)的时候可以进行字节取反。这样,CRC 的检查可以用直接的方法计算消息的 CRC、取反、然后与消息数据流中的 CRC 比较这个过程来完成,也可以通过计算全部的消息来完成。在后一种方法中,正确消息的结果不再是 0,而是 \sum_{i=n}^{2n-1} x^{i} 除以 K(x) 得到的结果。这个结果叫作核验多项式 C(x),它的十六进制表示也叫作幻数

按照惯例,使用 CRC-32 多项式以及 CRC-16-CCITT 多项式时通常都要取反。CRC-32 的核验多项式是

C(x) = x^{31} + x^{30} + x^{26} + x^{25} + x^{24} + x^{18} + x^{15} + x^{14} + x^{12} + x^{11} + x^{10} + x^8 + x^6 + x^5 + x^4 + x^3 + x + 1
  • 对于要处理的数据M(x)有前置0时,用 x^{m} L(x) M(x).x^{n}两式相加作取反运算,使得前置的0变成1后,再作 mod 2 运算得到 CRC。公式:

M(x) \cdot x^{n} + x^{m} L(x) = Q(x) \cdot K(x)  + R(x)
L(x) \,\!= \sum_{n=0}^{n-1} x^n
T(x) = M(x) \cdot x^{n} + L(x) + R(x)
例: M(x) = 01111
K(x) = x^{3} + x^{2} + 1 = 1101 ,这里可知 n=3
M(x).x^{3} = 01111000
\sum_{n=0}^{n-1} x^{n}n=3 故 L(x) 阶数从 2 开始
L(x) = x^{2} + x^{1} + x^{0} = 111
x^{m} L(x)求得一组 n 个 1 及 m 个 0以便与M(x).x^{n}相加
令 m = 5 ,X^{m} L(x) = X^{3} L(x) = 11100000 (bitwise shift)
M(x).x^{n} + x^{m} L(x) = 01111000 + 11100000 = 10011000(使M前置的0变成1)
10011000 mod2 K(x) 求得余R(x)= 011
T(x) = M(x).x^{n} + L(x) + R(x) = 01111000 + 111 + 011 = 01111100提交
接收端 L(x) = 111 且开头不为1 => m = 5
可反推 M(x).x^{n} + x^{m} L(x) + R(x) = 01111000 + 11100000 + 111 = 10011011
用 10011011 mod2 1101 可校验能被K(x)整除。

错误检测能力

CRC 的错误检测能力依赖于关键多项式的阶次以及所使用的特定关键多项式。误码多项式 E(x) 是接收到的消息码字与正确消息码字的异或结果。当且仅当误码多项式能够被 CRC 多项式整除的时候 CRC 算法无法检查到错误。

  • 由于 CRC 的计算基于除法,任何多项式都无法检测出一组全为零的数据出现的错误或者前面丢失的零。但是,可以根据 CRC 的变体来解决这个问题。
  • 所有只有一个数据位的错误都可以被至少有两个非零系数的任意多项式检测到。误码多项式是 x^k,并且 x^k 只能被 i \le k 的多项式 x^i 整除。
  • CRC 可以检测出所有间隔距离小于多项式阶次的双位错误,在这种情况下的误码多项式是
E(x) = x^i + x^k = x^k \cdot (x^{i-k} + 1), \; i > k

如上所述,x^k 不能被 CRC 多项式整除,它得到一个 x^{i-k} + 1 项。根据定义,满足多项式整除 x^{i-k} + 1{i-k} 最小值就是多项式的阶次。最高级次的多项式是本原多项式,带有二进制系数的 n 阶多项式

CRC 多项式规范

下面的表格略去了“初始值”、“反射值”以及“最终异或值”。

  • 对于一些复杂的校验和来说这些十六进制数值是很重要的,如 CRC-32 以及 CRC-64。通常小于 CRC-16 的 CRC 不需要使用这些值。
  • 通常可以通过改变这些值来得到各自不同的校验和,但是校验和算法机制并没有变化。

CRC 标准化问题

  • 由于 CRC-12 有三种常用的形式,所以 CRC-12 的定义会有歧义
  • 在应用的 CRC-8 的两种形式都有数学上的缺陷。
  • 据称 CRC-16 与 CRC-32 至少有 10 种形式,但没有一种在数学上是最优的。
  • 同样大小的 CCITT CRC 与 ITU CRC 不同,这个机构在不同时期定义了不同的校验和。

常用 CRC(按照 ITU-IEEE 规范)

名称多项式表示法:正常或者翻转
CRC-1x + 1
(用途:硬件,也称为奇偶校验位)
0x1 or 0x1 (0x1)
CRC-5-CCITTx^{5} + x^{3} + x + 1 (ITU G.704 标准)0x15 (0x??)
CRC-5-USBx^{5} + x^{2} + 1 (用途:USB 信令包)0x25 or 0x14 (0x9)
CRC-7x^{7} + x^{3} + 1 (用途:通信系统)0x09 or 0x48 (0x11)
CRC-8-ATMx^8 + x^2 + x + 1 (用途:ATM HEC)0x07 or 0xE0 (0xC1)
CRC-8-CCITTx^8 + x^7 + x^3 + x^2 + 1 (用途:1-Wire 总线) 
CRC-8-Dallas/Maximx^8 + x^5 + x^4 + 1 (用途:1-Wire bus)0x31 or 0x8C
CRC-8x^8 + x^7 + x^6 + x^4 + x^2 +10xEA(0x??)
CRC-10x10 + x9 + x5 + x4 + x + 10x233 (0x????)
CRC-12x^{12} + x^{11} + x^3 + x^2 + x + 1
(用途:通信系统)
0x80F or 0xF01 (0xE03)
CRC-16-Fletcher参见 Fletcher's checksum用于 Adler-32 A & B CRC
CRC-16-CCITTx16 + x12 + x5 + 1 (X25, V.41, Bluetooth, PPP, IrDA)0x1021 or 0x8408 (0x0811)
CRC-16-IBMx16 +x15 + x2 + 10x8005 or 0xA001 (0x4003)
CRC-16-BBSx16 + x15 + x10 + x3 (用途:XMODEM 协议)0x8408 (0x????)
CRC-32-AdlerSee Adler-32参见 Adler-32
CRC-32-MPEG2See IEEE 802.3参见 IEEE 802.3
CRC-32-IEEE 802.3x^{32} + x^{26} + x^{23} + x^{22} + x^{16} + x^{12} + x^{11} + x^{10} + x^8 + x^7 + x^5 + x^4 + x^2 + x + 10x04C11DB7 or 0xEDB88320 (0xDB710641)
CRC-32C (Castagnoli)x^{32} + x^{28} + x^{27} + x^{26} + x^{25} + x^{23} + x^{22} + x^{20} + x^{19} + x^{18} + x^{14} + x^{13} + x^{11} + x^{10} + x^9 + x^8 + x^6 + 10x1EDC6F41 or 0x82F63B78 (0x05EC76F1)
CRC-64-ISOx^{64} + x^4 + x^3 + x + 1
(use: ISO 3309)
0x000000000000001B or 0xD800000000000000 (0xB000000000000001)
CRC-64-ECMA-182x^{64} + x^{62} + x^{57} + x^{55} + x^{54} + x^{53} + x^{52} + x^{47} + x^{46} + x^{45} + x^{40} + x^{39} + x^{38} + x^{37} + x^{35} + x^{33} + x^{32}
+ x^{31} + x^{29} + x^{27} + x^{24} + x^{23} + x^{22} + x^{21} + x^{19} + x^{17} + x^{13} + x^{12} + x^{10} + x^9 + x^7 + x^4 + x + 1
(as described in ECMA-182 p.63)
0x42F0E1EBA9EA3693 or 0xC96C5795D7870F42 (0x92D8AF2BAF0E1E85)
CRC-128IEEE-ITU 标准。被 MD5 & SHA-1 取代 
CRC-160IEEE-ITU 标准。被 MD5 & SHA-1 取代 

CRC 与数据完整性

尽管在错误检测中非常有用,CRC 并不能可靠地校验数据完整性(即数据没有发生任何变化),这是因为 CRC 多项式是线性结构,可以非常容易地故意改变量据而维持 CRC 不变,参见CRC and how to Reverse it中的证明。我们可以用 Message authentication code 校验数据完整性。

CRC发生碰撞的情况

与所有其它的散列函數一样,在一定次数的碰撞测试之后 CRC 也会接近 100% 出现碰撞。CRC 中每增加一个数据位,就会将碰撞数目减少接近 50%,如 CRC-20 与 CRC-21 相比。

  • 理论上来讲,CRC64 的碰撞概率大约是每 18×1018 个 CRC 码出现一次。
  • 由于 CRC 的不分解多项式特性,所以经过合理设计的较少位数的 CRC 可能会与使用较多数据位但是设计很差的 CRC 的效率相媲美。在这种情况下 CRC-32 几乎同 CRC-40 一样优秀。

设计 CRC 多项式

生成多项式的选择是 CRC 算法实现中最重要的部分,所选择的多项式必须有最大的错误检测能力,同时保证总体的碰撞概率最小。多项式最重要的属性是它的长度,也就是最高非零系数的数值,因为它直接影响着计算的校验和的长度。

最常用的多项式长度有

  • 9 位 (CRC-8)
  • 17 位 (CRC-16)
  • 33 位 (CRC-32)
  • 65 位 (CRC-64)

在构建一个新的 CRC 多项式或者改进现有的 CRC 时,一个通用的数学原则是使用满足所有模运算不可分解多项式约束条件的多项式。

  • 这种情况下的不可分解是指多项式除了 1 与它自身之外不能被任何其它的多项式整除。

生成多项式的特性可以从算法的定义中推导出来:

  • 如果 CRC 有多于一个的非零系数,那么 CRC 能够检查出输入消息中的所有单数据位错误。
  • CRC 可以用于检测短于 2k 的输入消息中的所有双位错误,其中 k 是多项式的最长的不可分解部分的长度。
  • 如果多项式可以被 x+1 整除,那么不存在可以被它整除的有奇数个非零系数的多项式。因此,它可以用来检测输入消息中的奇数个错误,就像奇偶校验函数那样。

参见

总的分类

特殊技术参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CRC循环冗余校验)是一种常用的错误检测技术。CRC主要通过附加一个固定长度的校验码到数据中,来检测数据在传输过程中是否发生了错误。在CRC中,校验码是通过对数据进行除法运算得到的。 具体而言,给定一个二进制的数据块D,CRC会附加一个n位的校验码C到数据末尾,形成一个新的数据块D'C。校验码C被设计为使得D'C能够被一个特定的生成多项式G整除,如果在传输过程中发生了错误,这个多项式无法整除D'C,因此可以通过检查余数来判断是否发生了错误。 CRC的关键是选择适当的生成多项式G。常见的生成多项式包括CRC-8、CRC-16和CRC-32等。不同的生成多项式会产生不同长度的校验码,长度越长,检测到错误的可能性越高。 在进行CRC运算时,接收方会将接收到的数据块D'C除以生成多项式G。如果余数为0,则表明没有错误;如果余数不为0,则表明发生了错误。在这种情况下,接收方可以向发送方请求重新发送数据,以确保数据的正确性。 总而言之,CRC是一种通过附加校验码到数据中的方法,可以有效地检测传输过程中的错误。通过选择适当的生成多项式,可以提高CRC的检测能力。 ### 回答2: CRC循环冗余校验)是一种常见的错误检测技术,用于检测数据传输过程中是否发生了错误。它使用多项式除法的原理,将输入数据与生成多项式进行模2除法运算,得到校验码,然后将校验码附加到原始数据中进行传输,接收方再次进行CRC运算并检查校验码是否匹配,从而判断数据是否出现错误。 CRC算法主要基于封闭性和循环性的原则,它将传输的数据看作二进制数,使用一个生成多项式进行除法运算。该生成多项式在CRC算法中是固定的,不同的生成多项式对应不同的CRC校验码。一般情况下,生成多项式选取低于数据位数的最高次项为1,其余项为0。 CRC过程中,首先需要进行数据的比特填充,即将数据位数按照生成多项式的次数进行扩展,扩展的位数是生成多项式的位数减1。然后进行模2除法运算,逐位比较输入数据和生成多项式的对应位,若两位相同,则结果为0,否则为1。运算结束后得到CRC校验码,然后将其附加到原始数据后面,发送给接收方。 接收方收到数据后,同样经过除法运算得到接收到的校验码。如果接收到的校验码与发送方计算的校验码相同,说明数据传输过程中没有发生错误。如果两个校验码不匹配,则表示数据存在错误,需要重传或进行其他处理。 CRC循环冗余校验是一种简单、高效且广泛应用的错误检测技术,它能够检测发生在数据传输过程中的大多数错误,并且具有较低的错误漏检率和错误检测率。在网络通信、存储系统、计算机硬件等领域广泛应用,能够确保数据的完整性和可靠性。 ### 回答3: CRC循环冗余校验)是一种常用的数据校验方法。在计算机通信和存储中,为了确保数据的完整性和准确性,我们经常需要对数据进行校验。CRC是通过对数据进行除法运算来实现的。 CRC校验的基本原理是,将数据看作二进制多项式,然后利用除法运算来计算其余数。具体步骤如下: 1. 将待校验的数据表示为二进制形式,并在最高位补充k个0,其中k为CRC校验码的位数。 2. 选择一个固定的生成多项式G(x),作为除数。该多项式的系数即为CRC校验码的系数。 3. 将生成多项式G(x)左移k位,与待校验数据相异或。 4. 重复步骤3,直到所有数据位都被处理完。 5. 最后所得结果就是校验码,可以将其附加在原始数据后面发送。 6. 接收方根据接收到的数据,再次进行CRC校验。如果余数为0,则认为数据没有出错;反之,则认为数据出错。 CRC可以提供较高的校验效率和误码检测能力,常被应用于计算机网络、存储器、传感器等领域。它的优点是计算简单、校验速度快,并且能够检测到多种错误,包括单比特差错、双比特差错和突发差错等。 总而言之,CRC循环冗余校验是一种常用的数据校验方法,通过除法运算来计算校验码,并能够高效地检测数据的错误。它在通信和存储领域发挥着重要作用,确保了数据的完整性和可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值