赞
踩
CRC全称为Cyclic redundancy Check, 即循环冗余校验。
CRC是现在最常见的错误检测码之一,广泛应用于数据通信和存储设备中。CRC码能够很好的检测突发错误这类由外界干扰和环境因素引起的数据变化,但无法应对恶意篡改。CRC是系统码的一种,即计算后的码字为信息码+校验码。
01 算法原理
CRC的核心是多项式除法的计算,多项式每一项的系数代表对应位比特为1或0。CRC使用了GF(2)上的计算,即用异或来代替减法。被除数为信息码在后面补充与生成多项式最高项级数相同个数的0,除数为生成多项式,余数为生成的CRC校验码。下图表示了一个简单的CRC4的计算过程,信息码为1110,生成多项式的二进制表示为10011,最后求得的校验码为0001。
简而言之,CRC的校验码C,就是信息码M补0后除以生成多项式后产生的余数。当信息码发生改变时,除非R-C正好为生成多项式的倍数,否则校验码都会发生改变。更巧妙的是,C={M,校验码} ,即为被除数+余数,故对收到的码字再做一次多项式除法后,得到的余数即CRC校验码应该为0。
每种CRC码由一个生成多项式定义,一般来说常使用不可约多项式作为生成多项式。对于一个n-bit CRC,它生成的校验码长度为nbit,生成多项式长度为n+1,且最高项次数为n,即最高位系数永远为1。
最简单的1比特CRC编码,就是最常见的奇偶校验。
特别的,CRC是一种线性算法,即crc(x^y^z) = crc(x) ^ crc(y) ^ crc(z)。所以当CRC对一些基于异或的流密码的加密数据进行校验时,可以不需要知道相应的流密码。
02 硬件设计
串行设计
最常见的串行实现方式有两种,都是基于LFSR (Linear Feedback Shife Register)。这里我们用CRC4 ITU进行举例,其生成多项式为 ,二进制表示为10011。
首先,图B的LFSR很好理解,这里简称为LFSR(B)。根据多项式除法的计算原理,可知其计算{信息码,4'b0}的余数时,将信息码从左至右遍历,当比特为1时,将连续5比特数据与生成多项式相异或,剩余的数据接上结果再继续进行遍历。当比特为0时,即没有计算行为,继续比对下一个比特。
图A的LFSR结构会难以理解一些,这里简称为LFSR(A)。首先我们要明确一点是,多项式除法的被除数是{信息码,4'b0},即如果使用LFSR(B)进行计算时,假设信息码长度为16,则一共进行20次输入,剩下留在寄存器中的数据才是最后的计算结果。
当生成多项式固定时,最后输入的数据是固定个数的0,且与寄存器个数相同,那么我们是否可以将这个0的输入固定在电路设计中呢?LFSR(A)就是这样的一种设计,它只需要输入16比特数据就可以完成多项式除法的计算。
在这里列一个推导过程,帮助理解LFSR(A)的结构:
设信息码为,生成多项式二进制表示为,定义多项式除法取余为%。这里涉及到的加法都为在GF(2)域上的加法,即为异或计算。
从多项式的角度,CRC计算可以表示为,则可以被整除。易知,也可以被整除。
故易推导出,
(1)
现有
当信息码为时,结合式(1)可得:
根据多项式除法的计算,
这时候我们回过头来看图A的LFSR结构就很好理解了,寄存器的变换由决定,所以输入比特与最高位比特异或后,反馈到各个寄存器,反馈值具体与那几个寄存器进行异或计算取决于生成多项式G。
原创 | hzy
撰文 | hzy
编辑 | hzy
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。