快速CRC逆序校验方法

合集下载

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现

CRC校验算法详解及代码实现CRC校验算法的原理是利用生成多项式来计算数据的校验值。

在发送端,将数据和生成多项式进行计算得到一个校验值,然后将这个校验值附加到发送的数据后面一起传输。

在接收端,接收到数据后再次进行计算,并与接收到的校验值进行比较,如果相同则说明数据传输过程中没有错误,否则说明数据传输过程中出现错误。

下面是CRC校验算法的具体步骤:1.选择一个生成多项式,通常用一个二进制数表示。

生成多项式的位数称为CRC位数,常见的有CRC-8,CRC-16,CRC-32等。

2.将生成多项式的最高位与数据的最高位对齐,然后进行异或运算。

异或运算的结果作为下一次异或运算的输入,直到将所有数据都计算完毕。

3.将计算得到的结果作为校验值附加到数据后面一起传输。

下面是一个简单的CRC校验算法的代码实现:```pythondef crc(data, generator):crc_value = 0generator_length = len(generator)for bit in data:crc_value ^= bitif crc_value & 0x1:crc_value = (crc_value >> 1) ^ int(generator, 2)else:crc_value = crc_value >> 1return crc_value#测试数据data = [1, 0, 1, 1]generator = "1011"#进行CRC校验residue = crc(data, generator)print(residue)```在上面的代码中,`data`表示要进行校验的数据,以列表的形式表示,每个元素是一个二进制位。

`generator`表示生成多项式,以字符串的形式表示,每个字符是一个二进制位。

程序输出的结果为校验值。

总结:本文详细介绍了CRC校验算法的原理和步骤,并给出了一个简单的代码实现。

快速CRC逆序校验方法

快速CRC逆序校验方法

快速CRC逆序校验方法作者:梁海华盘丽娜来源:《计算机应用》2013年第07期文章编号:10019081(2013)07183303doi:10.11772/j.issn.10019081.2013.07.1833摘要:循环冗余校验(CRC)是计算机网络中常用的冗余校验方法。

针对现有的正序(FIFO)校验方法只能对编码寄存器为零初始状态时生成的校验值正确校验的问题,提出一种逆序(LIFO)校验方法。

首先,使用状态矩阵对两类串行编码电路进行分析,理论上证明状态矩阵可逆,由逆矩阵变换得出串行逆序校验方法及其电路;通过电路分析,可将串行逆序方法扩展为快速并行逆序方法,无须预补零操作,简化了计算流程。

通过实例计算,验证了并行逆序方法能够对任意初始状态生成的校验值正确校验;仿真结果表明该方法具有与并行正序校验方法近似的运算速度。

关键词:循环冗余校验;先进先出;初始状态;后进先出;运算速度中图法分类号:TP393文献标志码:A英文标题Method of fast cyclic redundancy check reverse decoding英文作者名LIANG Haihua*, PAN Lina英文地址(School of Computer Science and Engineering, Changshu Institute of Technology, Changshu Jiangsu 215500, China英文摘要)Abstract:Cyclic Redundancy Check (CRC) has already been used in the field of computer network widely. Since the existing First In First Out (FIFO) method can only decode checksum which is encoded when initial register s state is zero, a Last In First Out (LIFO) method was proposed. First of all, by analyzing two kinds of serial encoding circuit based on transition of state matrix, the authors theoretically proved the matrix was invertible, and serial LIFO method and its circuit could be derived. Depending on serial method, rapid parallel LIFO method was given, in no need of dummy bits, thus simplifying the calculation process. A case study verified the correctness of this method when decoding checksum, no matter what initial register s state was. The simulation results show that FIFO and LIFO have similar calculation speed.Cyclic Redundancy Check (CRC) has already been used in the field of computer network widely. Existing First In First Out (FIFO) method can only decode checksum which is encoded when initial register’s state is zero, a Last In First Out (LIFO) method is proposed. First of all, by analyzing two kind of serial encoding circuit based on transition of state matrix, the authors theoretically proved the matrix was invertible, serial LIFO method and its circuit could be derived. Depending on serial method, rapid parallel LIFO method was given, no needing dummy bits, simplifying the calculation process. Example verified the correctness of this method when decoding checksum, no matter what initial register’s state was. The simulation results show that FIFO and LIFO have similar performance of calculation speed.英文关键词Key words:Cyclic Redundancy Check (CRC); First In First Out (FIFO); initial state; Last In First Out (LIFO); calculation speed0 引言目前,在计算机通信领域,由于数据在传输或存储过程中会受到各种干扰产生误码,从而需要进行数据校验来确保数据的完整性,循环冗余校验(Cyclic Redundancy Check, CRC)是一种常用的方法[1-2],Peterson等提出了两种串行编码电路[3],Giuseppe等[4]和Cheng等[5]分别从不同的角度提出了并行编码方式;为了破解软件中CRC校验值的保护,Stigge等从串行编码计算方法角度提出了一种按位进行的CRC逆向求解方法[6]。

CRC生成与同构逆序校验方法_梁海华

CRC生成与同构逆序校验方法_梁海华
3 1卷 第9期 2 0 1 4年9月
微 电 子 学 与 计 算 机 M I C R O E L E C T R ON I C S &C OMP UT E R
V o l . 3 1 N o . 9 S e t e m b e r 0 1 4 2 p
C R C 生成与同构逆序校验方法
梁海华 ,盘丽娜 ,李克清
… … … …
0燄 0 … .设 输 入 的 处 理 序 列 1
( 、 )对应 I I型C R C 生成电路 0 =1 m =1 p p
此, 若图1中的初始状态为I 图2中的初始状态 N I T, 为Fm I N I T 时, I型 、 I I型电路生成的 C R C值相等 , ; , 两种电路等效 同理 若图 2 中的初始状态为I N I T, 图 1 中的初始状态为 F-m I N I T( F-1 为 F 的逆矩 ]已证明其存在 ) , 文献 [ 两种电路也等效 . 阵, 5
1 引言
在计 算 机 通 信 领 域 , 数据在传输或存储过程中 会受到各种干扰产 生 误 码 , 从而需要进行数据校验 来确保数据的完整性 , 循环冗余校验 ( C c l i c R e d u n - y
] 1 2 - , 是 一 种 常 用 的 方 法[ d a n c C h e c k,C R C) P e t e r - y [ ] 3 4 - , 即 I型、 s o n 提出 了 两 种 串 行 编 码 电 路 I I型 电

电路 ( 寄存器为零初 态 ) 进 行 校 验, 电路输出结果为 生成电路寄存器状态的逆序 .
a L 烆 烎 烎 ( ) 1
m m-1 1 图 3 p + … +p mX + m-1X 1X + 0 p p

CRC校验实现方法

CRC校验实现方法

CRC校验实现方法CRC原理CRC是什么东西呢?你用过RAR和ZIP等压缩软件吗?它们是不是常常会给你一个恼人的“CRC校验错误”信息呢?我想你应该明白了吧,CRC就是块数据的计算值,它的全称是“Cyclic Redundancy Check”,中文名是“循环冗余码”,“CRC校验”就是“循环冗余校验”。

CRC有什么用呢?它的应用范围很广泛,最常见的就是在网络传输中进行信息的校对。

其实我们大可以把它应用到软件保护中去,因为它的计算是非常非常非常严格的。

严格到什么程度呢?你的程序只要被改动了一个字节(甚至只是大小写的改动),它的值就会跟原来的不同。

所以只要给你的“原”程序计算好CRC值,储存在某个地方,然后在程序中随机地再对文件进行CRC校验,接着跟第一次生成并保存好的CRC值进行比较,如果相等的话就说明你的程序没有被修改/破解过,如果不等的话,那么很可能你的程序遭到了病毒的感染,或者被Cracker用16进制工具暴力破解过了。

我们先来看看CRC的原理。

首先看两个式子:式一:9 / 3 = 3 (余数 = 0)式二:(9 + 2 ) / 3 = 3 (余数 = 2)在小学里我们就知道,除法运算就是将被减数重复地减去除数X 次,然后留下余数。

所以上面的两个式子可以用二进制计算为:(不会二进制计算的可以撤退了)式一:1001 - 0011 =0110 对应的十进制等式为:9-3=6;0110 - 0011 =0011 对应的十进制等式为:6-3=3;0011 – 0011 =0000 对应的十进制等式为:3-3=0;一共减了3次,所以商是3,而最后一次减出来的结果是0,所以余数为0。

式二:1011 - 0011 =1000 对应的十进制等式为:11-3=8;1000 - 0011 =0101 对应的十进制等式为:8-3=5;0101 – 0011 =0010 对应的十进制等式为:5-3=2;一共减了3次,所以商是3,而最后一次减出来的结果是2,所以余数为2。

crc校验原理及步骤

crc校验原理及步骤

crc校验原理及步骤嘿,咱今儿就来聊聊这 CRC 校验!你说这 CRC 校验啊,就像是给数据穿上了一件特别的“保护衣”。

它的原理呢,其实挺有意思。

就好像我们要识别一群人里有没有冒牌货,得有个特别的办法来判断。

CRC 校验就是通过一种特定的计算方式,给数据生成一个独一无二的“标记”。

那具体步骤是咋样的呢?首先啊,得选个合适的生成多项式,这就好比选一把合适的钥匙。

然后呢,把要校验的数据当成宝贝一样,和这个生成多项式一起进行一番奇妙的运算。

这运算过程啊,就像是一场数据的舞蹈,各种数字在里面蹦跶、组合。

等这舞蹈结束,就得到了一个校验码。

这个校验码可重要啦,就像人的身份证号一样,能证明数据的身份。

当数据要传输或者存储的时候,就把这个校验码也带上。

等数据到了目的地,接收方再按照同样的步骤来一次,看看算出来的校验码和带来的一不一样。

如果一样,那就说明数据在旅途中没出啥问题,完好无损地到达啦!要是不一样呢,哎呀,那可就麻烦啦,说明数据可能在途中遭遇了什么“小意外”,得赶紧找找问题出在哪儿。

你想想,要是没有这 CRC 校验,那数据在传输过程中出了错都不知道呢!这就好像我们寄个重要包裹,没有保价一样,心里多不踏实呀!CRC 校验在很多地方都大显身手呢!比如在通信领域,它能确保信息准确无误地传达;在计算机存储中,它能保证数据的可靠性。

它就像一个默默无闻的守护者,时刻守护着数据的安全。

所以啊,可别小瞧了这 CRC 校验,它虽然听起来有点复杂,但作用可大着呢!它就像是数据世界里的一位忠诚卫士,为我们的数据保驾护航,让我们能安心地使用和传输数据。

你说是不是很厉害呢?。

crc校验方式

crc校验方式

crc校验方式一、引言在数据通信中,为了保证数据的完整性和正确性,常常需要对数据进行校验。

CRC(Cyclic Redundancy Check)是一种常用的校验方式,它可以通过计算数据的循环冗余校验值来检测数据是否被篡改。

本文将对CRC校验方式进行详细介绍。

二、CRC校验原理1. CRC码的生成过程CRC码的生成过程是通过将原始数据与一个预设的多项式进行异或运算得到的。

具体步骤如下:(1)将原始数据添加k个0,使其长度为n+k位。

(2)将多项式P左移k位得到G(x)。

(3)将n+k位的原始数据除以G(x),得到商Q(x)和余数R(x)。

(4)将余数R(x)作为CRC码添加到原始数据后面,得到n+k位的带CRC码的数据。

2. CRC校验过程接收方收到带有CRC码的数据后,会对其进行如下操作:(1)将接收到的n+k位带CRC码的数据除以G(x),得到商Q'(x)和余数R'(x)。

(2)如果R'(x)等于0,则认为接收到的数据没有发生错误;否则认为接收到的数据发生了错误。

三、CRC校验实现方法1. CRC-8CRC-8是一种8位的CRC校验方式,它的多项式为x^8+x^2+x^1+x^0。

其校验码长度为1字节(8位),可以用于检测数据传输中的单比特错误。

2. CRC-16CRC-16是一种16位的CRC校验方式,它的多项式为x^16+x^15+x^2+1。

其校验码长度为2字节(16位),可以用于检测数据传输中的双比特错误。

3. CRC-32CRC-32是一种32位的CRC校验方式,它的多项式为x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+ x^5+x^4+ x3+ x + 1。

其校验码长度为4字节(32位),可以用于检测数据传输中的多比特错误。

四、CRC校验应用场景1. 网络通信在网络通信中,数据传输过程中可能会发生丢包、重发等问题,使用CRC校验可以有效地检测并纠正这些问题。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。

当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。

到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。

因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。

如果有余数,则表明该帧在传输过程中出现了差错。

模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。

在循环冗余校验码(CRC)的计算中有应用到模2除法。

例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。

注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。

3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,用于验证数据传输过程中是否存在错误。

CRC校验采用生成多项式对数据进行计算,从而生成一个固定长度的冗余校验码,将该校验码附加在数据后面进行传输,接收方利用同样的生成多项式对接收到的数据进行计算,并与接收到的校验码进行比较,如果校验码一致,则认为数据传输没有错误;如果校验码不一致,则认为数据传输存在错误。

1.选择生成多项式:在进行CRC校验前,需要选择一个生成多项式。

常用的生成多项式有:CRC-8,CRC-16,CRC-32等。

根据实际情况选择不同的生成多项式。

2.数据填充:在数据的末尾添加一组"0",长度等于生成多项式的次数加1、例如,如果选择的生成多项式为CRC-8,则在数据末尾填充一组"0",长度为9;如果选择的生成多项式为CRC-16,则在数据末尾填充一组"0",长度为173.生成校验码:利用生成多项式对填充后的数据进行除法运算,计算余数。

余数即为校验码。

通常,余数的位数为生成多项式的次数。

4.将校验码添加到数据中:将生成的校验码添加到数据末尾,并进行传输。

5.接收方计算校验码:接收方接收到数据后,利用接收到的数据和相同的生成多项式进行除法运算,计算余数。

6.比较校验码:接收方得到余数后,将其与接收到的校验码进行比较。

如果两者一致,则认为数据传输没有错误;如果两者不一致,则认为数据传输存在错误。

CRC校验的原理是利用多项式除法运算,将数据作为一个伪多项式进行计算,并得到一个余数。

由于多项式的特性,如果在数据传输过程中出现了错误,那么接收方计算得到的余数一定与发送方生成的校验码不一致。

通过比较余数和校验码,接收方可以判断数据是否传输正确。

1.简单高效:CRC校验算法计算速度快,适用于高速数据传输。

2.安全性高:CRC校验算法能够高效地检测出多种错误,包括单比特错误、双比特错误等。

CRC校验方法详解

CRC校验方法详解

CRC校验方法详解CRC(Cyclic Redundancy Check)是一种数据校验方法,广泛应用于网络通信、存储介质和数据传输领域,用于检测和纠正数据传输过程中的错误。

CRC校验使用一种多项式计算方法,通过计算传输的数据的余数来检测错误。

在发送端,多项式运算被用于生成一定长度的校验码,并将它附加到待发送的数据中。

在接收端,数据和校验码被再次进行多项式运算,得到一个余数。

如果余数为0,说明数据传输没有错误;如果余数不为0,则说明数据出现了错误。

1.选择一个合适的CRC生成多项式。

CRC校验的效果取决于所选择的生成多项式。

常用的生成多项式有CRC-8、CRC-16和CRC-32等。

2.将待发送的数据构造成一个二进制多项式。

数据的每个字节被表示为8位二进制数,按照顺序排列,形成一个多项式。

3.将生成多项式左移和数据多项式异或。

将生成多项式左移和数据多项式进行异或操作,然后进行下一位的判断。

4.重复上述步骤,直到进行完所有的位判断。

这样可以得到一个余数,用于校验数据传输中的错误。

总结来说,CRC校验是通过计算数据的余数来检测错误的一种方法。

它通过选择一个合适的生成多项式,对待发送的数据进行多项式运算,得到一个余数。

接收端再次进行多项式运算,检查余数是否为0。

如果余数为0,则说明数据传输没有错误。

如果余数不为0,则说明数据传输中可能存在错误。

1.高效性:CRC校验是一种简单的校验方法,计算速度较快,可以快速检测数据传输中是否存在错误。

2.纠错能力强:CRC校验不仅可以检测出数据传输中存在的错误,还可以通过余数的位置和值,定位并纠正错误。

3.易于实现:CRC校验的实现比较简单,只需要选择合适的生成多项式,然后进行多项式运算即可。

然而,CRC校验方法也存在一些缺点:1.不适用于所有场景:CRC校验对于一些特殊的数据传输情况可能不适用,例如数据长度较长或者存在较高的错误率。

2.无法纠正所有错误:虽然CRC校验可以检测出存在的错误,并且对于一些错误还能进行纠正,但它无法纠正所有的错误,有些错误会被误判为正确的数据。

crc逆序表格

crc逆序表格

CRC(循环冗余校验)是一种用于检测数据传输错误的算法。

在CRC中,有一个称为“逆序表格”的概念,它是一种预先计算好的表,用于快速计算CRC校验码。

这个表格包含了固定长度的二进制串对应的CRC值,对于一个给定的生成多项式,可以生成一个唯一的逆序表格。

通过使用这个表,可以在常数时间内查找对应的CRC值,从而提高了计算效率。

逆序表格的生成方法是基于多项式的逆元和模运算的性质。

具体来说,对于一个给定的生成多项式,首先将它转换为二进制形式,然后通过遍历二进制串的所有可能情况来生成表格。

对于每个二进制串,计算其CRC值,并将结果存储在表格中。

最终得到的表格就是逆序表格。

使用逆序表格进行CRC计算时,首先将要校验的数据转换为二进制串,然后通过查找逆序表格找到对应的CRC值。

如果计算得到的CRC值与预存的CRC值相等,则说明数据传输无误;否则,说明数据传输过程中出现了错误。

需要注意的是,逆序表格的生成和存储都需要一定的时间和空间资源。

因此,在实际应用中,需要根据具体情况选择合适的生成多项式和存储方式,以实现高效、准确的CRC校验。

CRC校验方法_详解

CRC校验方法_详解

CRC一概述CRC(Cyclical Redundancy Check)循环冗余码校验根据应用环境与习惯的不同,CRC又可分为以下几种标准:①CRC-12码;②CRC-16码;③CRC-CCITT码;④CRC-32码。

CRC-12码通常用来传送6-bit字符串。

CRC-16及CRC-CCITT码则用是来传送8-bit字符,其中CRC-16为美国采用,而CRC-CCITT为欧洲国家所采用。

CRC-32码大都被采用在一种称为Point-to-Point的同步传输中。

二实现方法2.1 最常用的方法是CRC-16。

CRC—16的C语言实现有四种方法:1 直接计算法;2 半查表法;3 全查表法;4 双8位表全查表法。

2.2 选择方法依据基于位运算的算法是非常慢的而且效率很低。

因此,在实际使用中不推荐使用“计算法”来生成CRC校验码,而建议使用“查表法”来进行CRC校验码计算。

半查表法既计算又查表,表占用空间小,适合小文件或者数据包校验;全查表法是标准查表法;双8位表全查表法表量大,查询方便,适合大文件校验。

因此,如果你的磁盘文件体积一般,建议使用全查表法,如果比较大如安装包,建议使用双8位表全查表法。

三查表法查表法可以大大提高计算速度。

实现实现方法如下:unsigned short CRC16Table[256]={ /* CRC16 余式表 */ 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0};/*************************************************************描述: CRC16校验查表子程序,速度快,占用空间大入口参数: pcrc:指向数组指针; count:校验字节个数出口参数: 16位CRC校验码**************************************************************/unsigned short CRC16_Table(unsigned char *pcrc, unsigned int count){unsigned short crc16 = 0;unsigned char crcregister;for( ; count > 0; count--){crcregister = (unsigned short)crc16 >> 8;crc16 <<= 8;crc16 ^= CRC16Table[crcregister ^ *pcrc];pcrc++;}return(crc16);}。

快速CRC逆序校验方法

快速CRC逆序校验方法
LI ANG Ha i hu a .PAN Li n a
( S c h o o l o fC o m p u t e r S c i e n c e a n d E n g i n e e r i n g ,C h a n g s h u I n s t i t u t e fT o e c h n o l o g y ,C h a n g s h u J i a n g s u 2 1 5 5 0 0 ,C h i n a )
快速 C RC逆 序 校 验 方 法
梁海 华 ’ , 盘 丽 娜
( 常熟理 工学 院 计算机科学与工程学院, 江苏 常熟 2 1 5 5 0 0 ) ( 通信作者 电子 邮箱 e d w a r d 3 m e @1 6 3 . c o m )

要: 循环 冗余校验 ( C R C ) 是 计算机 网络 中常 用的冗余校验 方法。针 对现 有的正序 ( F I F O ) 校验 方法 只能对编
码寄存器 为零初始状 态时生成的校验值正确校验 的问题 , 提 出一种 逆序 ( L I F O) 校验 方 法。首先 , 使 用状 态矩 阵对两 类 串行编码 电路进行分析 , 理论上证 明状 态矩 阵可逆 , 由逆 矩 阵变换得 出 串行逆序 校验 方 法及其 电路 ; 通过 电路 分 析, 可将 串行 逆序 方法扩展 为快速并行逆序 方法 , 无须预补零操作 , 简化 了计算流程。通过 实例计算 , 验 证 了并行逆序
Ab s t r a c t :C y c l i c R e d u n d a n c y C h e c k( C R C )h a s l a r e a d y b e e n u s e d i n t h e i f e l d o f c o mp u t e r n e t w o r k w i d e l y .S i n c e t h e

crc校验算法计算过程

crc校验算法计算过程

crc校验算法计算过程CRC(CyclicRedundancyCheck)循环冗余校验算法是在数据传输过程中应用的一种工具,有效的检测接收到的数据中只有很小的概率发生数据传输错误的情况,是目前应用最广泛的数据错误检测算法之一。

CRC算法可以将错误检测任务减少到接近于理想化的水平,针对随机等可能发生错误的计算机系统,它能够检测出所有位数不超过2k-1位的二进制错误,并能够检测出99.998%的随机等应用错误。

CRC校验算法计算过程主要包括四个步骤:1.将待校验的二进制数据段与预先设定的多项式进行按位模2的乘法运算,得到一个多项式结果。

2.将乘法结果按照CRC算法要求进行右移和异或运算,进行除法运算,得到的余数称为CRC码,即为所要求的校验位。

3.在发送时,将数据段与CRC码连接在一起,一起发给接收方。

4.接收方接收到报文后,将报文与CRC码分离,对数据段进行校验,并重复上述运算,得到CRC码,比较两者是否相等,以确定数据是否正确地传输到接收方。

CRC校验算法是在数据传输过程中应用的一种工具,可以有效地检测数据传输中只有很小概率发生的错误,是很多计算机系统的重要保证。

这里以一个简单的例子来说明CRC算法的计算过程。

假设有一个原始数据段是“11010010”,预先设定的要求多项式是“10001001”,那么CRC算法计算过程如下:1.将“11010010”按位与“10001001”进行乘法运算(即模2加法),得到结果是“01001001”。

2.将乘法运算结果按CRC算法的要求,右移一位,再将右移的结果和“10001001”进行异或,得到结果是“00001101”。

3.将两者再次右移一位,再将右移的结果和多项式“10001001”进行异或,得到结果是“00110001”。

4.再进行两次右移,再将右移的结果和多项式“10001001”进行异或,得到结果是“11001000”,这就是所要求的CRC码。

以上便是CRC算法的计算过程,可以看出,CRC算法是一个非常简单而又高效的数据错误检测算法。

crc 校验方法

crc 校验方法

crc 校验方法CRC校验方法概述CRC(Cyclic Redundancy Check)校验是一种常用的错误检测方法,它通过对数据进行简单的计算,生成校验码,以验证数据在传输或存储过程中是否发生错误。

本文将详细介绍CRC校验方法的原理、计算过程以及应用。

一、CRC校验原理CRC校验方法基于多项式除法,通过对待校验数据与生成多项式进行除法运算,得到余数作为校验码。

校验码的长度通常为固定值,比如CRC-16(16位CRC校验码)或CRC-32(32位CRC校验码)。

二、CRC校验计算过程1. 选择生成多项式:根据需求选择合适的生成多项式,如CRC-16采用的生成多项式是x^16 + x^15 + x^2 + 1。

2. 准备待校验数据:将待校验数据转换成二进制形式。

3. 添加校验位:在待校验数据的末尾添加与生成多项式位数相同的0,得到扩展数据。

4. 除法运算:将扩展数据与生成多项式进行模2除法运算,得到余数。

5. 得到校验码:将余数作为校验码添加到原始数据中,形成最终的数据帧。

三、CRC校验应用1. 数据传输中的错误检测:在数据传输过程中,发送方对数据进行CRC校验并将校验码附加在数据帧中,接收方收到数据后也进行CRC 校验,通过比较计算得到的校验码与接收到的校验码是否一致,可以判断数据是否出现错误。

2. 存储介质的数据完整性验证:在磁盘、光盘等存储介质上,数据经过CRC校验后写入,读取时再进行校验,以确保数据的完整性。

3. 网络通信中的数据校验:在以太网、无线通信等网络通信中,CRC校验用于检测数据帧在传输过程中是否发生错误。

4. 文件校验:CRC校验常用于校验下载文件的完整性,通过比较计算得到的校验码与提供的校验码是否一致,可以判断文件是否被修改或损坏。

四、CRC校验的优缺点1. 优点:- 简单高效:CRC校验方法计算简单,速度快。

- 高可靠性:CRC校验能够有效检测多种错误类型,包括单比特错误和多比特错误。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤什么是CRC校验?CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。

当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。

到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。

因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。

如果有余数,则表明该帧在传输过程中出现了差错。

模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。

在循环冗余校验码(CRC)的计算中有应用到模2除法。

例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。

注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。

3. 将计算出来的CRC校验码附加在原数据帧后面,构建成一个新的数据帧进行发送;最后接收端在以模2除法方式除以前面选择的除数,如果没有余数,则说明数据帧在传输的过程中没有出错。

CRC32 算法分析、逆向

CRC32 算法分析、逆向

有些朋友不知道什么用途1,让自己的好看点(自我安慰)2,遇到校验的可能有用,自己写程序的时候也能用用现在略微整理下算法和分析过程,拿出来共享和交流。

下面是我的全分析过程.' ******************** CRC验证 ********************'返回验证码二进制串Public Function CRC32(ByRef bArrayIn() As Byte, ByVal lLen As Long) As LongDim lCurPos As LongDim lTemp As LongDim crcTable(0 To 255) As LongDim i As Long, x As Long, crc As LongConst Limit = &HEDB88320For i = 0 To 255crc = iFor x = 0 To 7If crc And 1 Thencrc = (((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFF) Xor LimitElsecrc = ((crc And &HFFFFFFFE) \ 2) And &H7FFFFFFFEnd IfNext xcrcTable(i) = crcNext i'以上初始化出来一个表(是固定的)If lLen < 0 Then Exit FunctionlTemp = &HFFFFFFFFFor lCurPos = 0 To lLenlTemp = (((lTemp And &HFFFFFF00) \ &H100) And &HFFFFFF) Xor (crcTable((lTemp And 255) Xor bArrayIn(lCurPos)))'前三位*3 xor 表(第四位*1 xor 新字节*1)*4Next lCurPos'取反输出结果 -->结果取其十六进制标记就是我们常见的CRC32了CRC32 = lTemp Xor &HFFFFFFFFEnd Function关键部分就再循环,他做了什么呢它每次加入一个新字节,和先前计算的结果4字节进行计算先前由(高到底): A1 A2 A3 A4新加入的字节: B(n)计算结果: C1 C2 C3 C4计算方式:(注意^ 为异或计算)┌→A1 A2 A3 A4 →A4 ^ B(n)│ ↘↘↘↘↙│ 00 A1 A2 A3 X│ ^ ^ ^ ^ ↓(查表)│ T1 T2 T3 T4 ←←T(X)│ ↓ ↓ ↓ ↓└─T1 C2 C4 C4↓ ↓ ↓ ↓(最后一次完成后取反)R1 R2 R3 R4 ;CRC32 结果新值C经过一次计算后,他的最高位C1没变,是查表的最高位T1那么这个表T1的值是不是唯一的呢,我们把表打印出来(见文章末尾),看一下可喜的是,最高位(00-FF)都是一对一得关系,从00到FF没有重复,那么逆向推导就成为可能了现在我们知道了文件得CRC32,那么就知道最后一次循环后得值(取反可得),这个值得最高位,就是它最后一次查表的值由于这个表和查表是一一对应关系,我们可以知道两点1. T1 可以得到T(X) 也就是T1 T2 T3 T42. T1 可以得到X 也就是A4 ^ B(n)由T(X) 和 C 我们可以得到A1 A2 A3 ,这是倒数第一次循环计算的高位3字节,用同样的方法我们可以得到倒数第二次循环计算的高位2字节倒数第三次循环计算的高位1字节倒数第四次循环计算的高位0字节(也就是说4次这样的循环计算后,再前面的结果就是任意的了)一次循环,会模糊掉一个字节位的crc32校验,4次循环会模糊掉四字节的CRC32校验这样只要指定最后4个字节,我们就可以达到修改出任意CRC32现在,我们要把一个CRC校验文件添加4字节CE037B28 转换为09635B62(这也是我最初的实验,很痛苦;计算试了几次没成功,从算法上看又可行,因为自己一没注意就计算错了)CE037B28 -> 09635B62 ;目的CRC'取反31FC84D7 -> F69CA49D↓↓↓↓↓9CA49DF6B9265B D5 {表} F6查表→D5(X的值)↓↓↓↓ ↓ →F6B9265B(T的值)F62582C6 ↓去掉最高位F6 ↓↙↙↙↙ ; 向高位移动2582C6[*D5] ; N1 xor old1 =x12582C6[^D5];82C6 [^D5]25 6FD2 A0 B2 {表}25 ED14 [^D5^A0]ED14 [^D5^A0] [^B2]EDB88320 =80 {表}AC[^D5^A0^83][^A5^20][^6D]AC BC F9 40 2B {表}[^D5^A0^83^BC][^B2^20^F9][^80^40][^2B]31 FC 84 D7 ;与原来的31FC84D7再次异或7B 97 44 FC ;这是最后添加的4个字节为什么到最后要这样再异或一次呢,因为A^B=C → A^C=B → B^C=A原来CRC取反A1 A2 A3 A4 A修改4字节CRC取反B1 B2 B3 B4 B目的CRC取反C1 C2 C3 C4 C要的到A^B=C 我们已知A,C 异或一下就得到我们需要的B了,虽然还需要经过一段运算认真的读者会发现,CRC32逆运算更容易得到想要的CRC的值,而正运算几乎是不可能的,因为我们每加一新数据时候,只能确定CRC4字节中的1字节,而其他字节都会有影响的。

CRC原理及其逆向破解方法

CRC原理及其逆向破解方法

CRC原理及其逆向破解⽅法CRC原理及其逆向破解⽅法介绍:这篇短⽂包含CRC原理介绍和其逆向分析⽅法,很多程序员和破解者不是很清楚了解CRC的⼯作原理,⽽且⼏乎没⼈知道如何逆向分析它的⽅法,事实上它是⾮常有⽤的.⾸先,这篇教程教你⼀般如何计算CRC,你可以将它⽤在数据代码保护中.第⼆,主要是介绍如何逆向分析CRC-32,你可以以此来分析程序中的CRC保护(象反病毒编码).当然有很多有效的⼯具⽤来对付CRC,但我怀疑它是否会说明原理.我要告诉你,这篇短⽂⾥中应⽤了很多数学知识,这不会影响⼀些⼈,⽽且会被⼀般的程序员与逆向分析者很好理解.为什么?那么如果你不知道数学是如何被应⽤在CRC中,我建议你可以停⽌继续学习了.所以我假定你们(读者)都是具备⼆进制算术知识的.第⼀部分:CRC 介绍,CRC是什么和计算CRC的⽅法.循环冗余码 CRC我们都知道CRC.甚⾄你没有印象,但当你想到那些来⾃诸如RAR,ZIP等压缩软件发给你由于错误连接和其他⼀些意外原因导致的⽂件错误的恼⼈的消息时,你就会知道.CRC是块数据的计算值,⽐如对每⼀个⽂件进⾏压缩.在⼀个解压缩过程中,程序会从新计算解压⽂件的CRC值,并且将之与从⽂件中读取的CRC值进⾏⽐对,如果值相同,那么正确.在CRC-32中,会有1/2^32的可能性发⽣对确认数据更改的校验错误.很多⼈认为CRC就是循环冗余校验,假如CRC真的就是循环冗余校验,那么很多⼈都错⽤了这个术语.你不能说 "这个程序的CRC是12345678 ".⼈们也常说某⼀个程序有CRC校验,⽽不说是 "循环冗余校验 " 校验.结论:CRC 代表循环冗余码,⽽不是循环冗余校验.计算是如何完成的呢?好,主要的想法就是将⼀个⽂件看成⼀个被⼀些数字分割的很长的位字串,这⾥会有⼀个余数---CRC!你总会有⼀个余数(可以是0),它⾄多⽐除数⼩⼀.(9/3=3 余数=0 ; (9+2)/3=3 余数=2)(或者它本⾝就包含⼀个除数在其中).在这⾥CRC计算⽅法与除法有⼀点点区别,除法就是将被减数重复的减去除数X次,然后留下余数.如果你希望得到原值,那么你就要把除数乘上X次,然后加上余数.CRC计算使⽤特殊的减法与加法完成的.也就是⼀种新的 "算法 ".计算中每⼀位计算的进位值被 "遗忘 "了.看如下两个例⼦,1是普通减法,2和3是特殊的.-+(1) 1101 (2) 1010 1010 (3) 0+0=0 0-0=01010- 1111+ 1111- 0+1=1 *0-1=1---- ---- ---- 1+0=1 1-0=10011 0101 0101 *1+1=0 1-1=0在(1)中,右数第⼆列可以看成是0-1=-1,因此要从⾼位借1,就变成(10+0)-1=1.(这就象普通的 'by-paper '⼗进制减法).特例(2,3)中,1+1会有正常的结果10, '1 '是计算后的进位.这个值被忽略了.特殊情况0-1应该有正常结果 '-1 '就要退到下⼀位.这个值也被忽略了.假如你对编程有⼀定了解,这就象,XOR 操作或者更好.现在来看⼀个除法的例⼦:在普通算法中:1001/1111000\1101 13 9/120\131001 - 09 -|---- -- |1100 30 |1001 - 27 ----- --0110 3 -> 余数0000 -----11001001 -1001 -----011 -> 3, 余数在CRC算法中:1001/1111000\1110 9/120\14 余数为 61001 -----11001001 -----10101001 -----01100000 -----110 -> 余数(例 3)这个除法的商并不重要,也没必要去记住,因为他们仅仅是⼀组⽆关紧要的位串.真正重要的是余数!它就是这个值,可以说⽐原⽂件还重要的值,他就是基本的CRC.过度到真正的CRC码计算.进⾏⼀个CRC计算我们需要选则⼀个除数,从现在起我们称之为 "poly ".宽度W就是最⾼位的位置,所以这个poly 1001的W 是3,⽽不是4.注意最⾼位总是1,当你选定⼀个宽度,那么你只需要选择低W各位的值.假如我们想计算⼀个位串的CRC码,我们想确定每⼀个位都被处理过,因此,我们要在⽬标位串后⾯加上W个0位.在此例中,我们假设位串为1111.请仔细分析下⾯⼀个例⼦:Poly = 10011, 宽度 W=4位串 BitstringBitstring + W zeros = 110101101 + 000010011/1101011010000\110000101 (我们不关⼼此运算的商)10011|||||||| ------||||||||10011|||||||10011||||||| ------|||||||00001||||||00000|||||| ------||||||00010|||||00000||||| ------|||||00101||||00000|||| ------||||01010|||00000||| ------|||10100||10011|| ------||01110|00000| ------|1110010011 ------1111 -> 余数 -> the CRC!(例 4)重要两点声明如下:1.只有当Bitstring的最⾼位为1,我们才将它与poly做XOR运算,否则我们只是将Bitstring左移⼀位.2.XOR运算的结果就是被操作位串bitstring与低W位进⾏XOR运算,因为最⾼位总为0.算法设计:你们都应知道基于位运算的算法是⾮常慢的⽽且效率低下.但如果将计算放在每⼀字节上进⾏,那么效率将⼤⼤提⾼.不过我们只能接受poly的宽度是8的倍数(⼀个字节;).可以形象的看成这样⼀个宽度为32的poly(W=32):3 2 1 0 byte+---+---+---+---+Pop! <--| | | | | <-- bitstring with W zero bits added, in this case 32 +---+---+---+---+1 <--- 32 bits ---> this is the poly, 4*8 bits(figure 1)这是⼀个你⽤来存放暂时CRC结果的记存器,现在我称它为CRC记存器或者记存器.你从右⾄左移动位串,当从左边移出的位是1,则整个记存器被与poly的低W位进⾏XOR运算.(此例中为32).事实上,我们精确的完成了上⾯除法所做的事情.移动前记存器值为:10110100当从右边移⼊4位时,左边的⾼4位将被移出,此例中1011将被移出,⽽1101被移⼊.情况如下:当前8位CRC记存器 : 01001101刚刚被移出的⾼4位 : 1011我们⽤此poly : 101011100, 宽度 W=8现在我们⽤如前介绍的⽅法来计算记存器的新值.顶部记存器---- --------1011 01001101 ⾼四位和当前记存器值1010 11100 + (*1) Poly 放在顶部最⾼位进⾏XOR运算 (因为那⾥是1)-------------0001 10101101 运算结果现在我们仍有⼀位1在⾼4位:0001 10101101 上⼀步结果1 01011100+ (*2) Poly 放在顶部的最低位进⾏XOR运算 (因为那⾥是1)-------------0000 11110001 第⼆步运算结果^^^^现在顶部所有位均为0,所以我们不需要在与poly进⾏XOR运算你可以得到相同的结果如果你先将(*1)与(*2)做XOR然后将结果与记存器值做XOR.这就是标准XOR运算的特性:(a XOR b) XOR c = a XOR (b XOR c) 由此,推出如下的运算顺序也是正确的. 1010 11100 poly (*1) 放在顶部最⾼位1 01011100+ polys (*2) 放在顶部最低位-------------1011 10111100 (*3) XOR运算结果The result (*3) 将(*3)与记存器的值做XOR运算1011 101111001011 01001101+ 如右:-------------0000 11110001你看到了吗?得到⼀样的结果!现在(*3)变的重要了,因为顶部为1010则(3)的值总是等于10111100(当然是在⼀定的条件之下)这意味着你可以预先计算出任意顶部位结合的XOR值. 注意,顶部结果总是0,这就是组合XOR操作导致的结果.(翻译不准确,保留原⽂)现在我们回到figure 1,对每⼀个顶部字节的值都做移出操作,我们可以预先计算出⼀个值. 此例中,它将是⼀个包含256个double word(32 bit)双字的表.(附录中CRC-32的表).(翻译不准确,保留原⽂)⽤伪语⾔表⽰我们的算法如下:While (byte string is not exhausted)BeginTop = top_byte of register ;Register = Register shifted 8 bits left ORred with a new byte from string ;Register = Register XORred by value from precomputedTable at position Top ; Enddirect table算法:上⾯提到的算法可以被优化.字节串中的字节在被⽤到之前没有必要经过整个记村器.⽤这个新的算法,我们可以直接⽤⼀个字节去XOR⼀个字节串通过将此字节移出记存器.结果指向预先计算的表中的⼀个值,这个值是⽤来被记存器的值做XOR运算的.我不⼗分确切的知道为什么这会得到同样的结果(这需要了解XOR运算的特性),但是这⼜极为便利,因为你⽆须在你的字节串后填充0字节/位.(如果你知道原理,请告诉我:)让我们来实现这个算法:+---- < byte string (or file) 字节串,(或是⽂件)|v 3 2 1 0 byte 字节| +---+---+---+---+XOR--- <| | | | | Register 记存器| +---+---+---+---+| || XOR| ^v +---+---|---+---+| | | | | | Precomputed table 值表(⽤来进⾏操作)| +---+---+---+---++---> -: : : : :+---+---+---+---+| | | | |+---+---+---+---+(figure 2)'reflected ' direct Table 算法:由于这⾥有这样⼀个与之相对应的 '反射 '算法,事情显得复杂了.⼀个反射的值/记存器就是将它的每⼀位以此串的中⼼位为标准对调形成的.例如:0111011001就是1001101110的反射串.他们提出 '反射 '是因为UART(⼀种操作IO的芯⽚)发送每⼀个字节时是先发最没⽤的0位,最后再发最有意义的第七位.这与正常的位置是相逆的.除了信息串不做反射以外,在进⾏下⼀步操作前,要将其于的数据都做反射处理.所以在计算值表时,位向右移,且poly也是作过反射处理的.当然,在计算CRC时,记存器也要向右移,⽽且值表也必须是反射过的.byte string (or file) --> ---+| 1. 表中每⼀个⼊⼝都是反射的.byte 3 2 1 0 V 2. 初始化记存器也是反射的.+---+---+---+---+ | 3. 但是byte string中的数据不是反射的,| | | | |> ---XOR 因为其他的都做过反射处理了.+---+---+---+---+ || |XOR V^ |+---+---|---+---+ || | | | | | 值表+---+---+---+---+ |: : : : : <---++---+---+---+---+| | | | |+---+---+---+---+(figure 3)我们的算法如下:1. 将记存器向右移动⼀个字节.2. 将刚移出的哪个字节与byte string中的新字节做XOR运算,得出⼀个指向值表table[0..255]的索引3. 将索引所指的表值与记存器做XOR运算.4. 如数据没有全部处理完,则跳到步骤1.下⾯是这个算法的简单的可执⾏汇编源码:完整的CRC-32标准所包含的内容:Name : "CRC-32 "Width : 32Poly : 04C11DB7Initial value : FFFFFFFFReflected : TrueXOR out with : FFFFFFFF作为对你好奇⼼的奖励, 这⾥是CRC-16标准: :)Name : "CRC-16 "Width : 16Poly : 8005Initial value : 0000Reflected : TrueXOR out with : 0000'XOR out with ' 是为了最终得到CRC⽽⽤来与记存器最后结果做XOR运算的值.假如你想了解⼀些关于 'reversed '逆向CRC poly的话,请看我的参考⽂章.我是在16位DOS模式下⽤的32位编码,因此你会在这个程序中看到很多32位与16位混合的编码...当然这是很容易转换成纯32位编码的.注意这个程序是经过完整测试并且能够正常运⾏的.下⾯的Java 和 C 代码都是由这个汇编代码⽽来的.底下的这段程序就是⽤来计算CRC-32 table的:xor ebx, ebx ;ebx=0, 将被⽤做⼀个指针.InitTableLoop:xor eax, eax ;eax=0 为计算新的entry.mov al, bl ;al <-bl;⽣成⼊⼝.xor cx, cxentryLoop:test eax, 1jz no_topbitshr eax, 1xor eax, polyjmp entrygoonno_topbit:shr eax, 1entrygoon:inc cxtest cx, 8jz entryLoopmov dword ptr[ebx*4 + crctable], eaxinc bxtest bx, 256jz InitTableLoop注释: - crctable 是⼀个包含256个dword的数组.- 由于使⽤反射算法,EAX被向右移.- 因此最低的8位被处理了.⽤Java和C写的代码如下(int is 32 bit):for (int bx=0; bx <256; bx++){int eax=0;eax=eax&0xFFFFFF00+bx&0xFF; // 就是 'mov al,bl ' 指令for (int cx=0; cx <8; cx++){if (eax&&0x1) {eax> > =1;eax^=poly;}else eax> > =1;}crctable[bx]=eax;}下⾯的汇编代码是⽤来计算CRC-32的:computeLoop:xor ebx, ebxxor al, [si]mov bl, alshr eax, 8xor eax, dword ptr[4*ebx+crctable]inc siloop computeLoopxor eax, 0FFFFFFFFh注释: - ds:si 指向将要被处理的byte string信息流.- cx 信息流的长度.- eax 是当前的CRC.- crctable是⽤来计算CRC的值表.- 此例中记存器的初始值为: FFFFFFFF.- 要将中间值与FFFFFFFFh做XOR才能得到CRC下⾯是Java和C写的代码:for (int cx=0; cx> =8;eax^=crcTable[ebx];}eax^=0xFFFFFFFF;现在我们已经完成了本⽂的第⼀部分:CRC原理部分,所以如果你希望能够对CRC做更深的研究,那么我建议你去读在本⽂最后给出连接上的资料,我读了.好了,终于到了本⽂最有意思的部分,CRC的逆向分析!。

crc校验算法

crc校验算法

crc校验算法crc校验的描述:1.CRC校验原理CRC校验的原理的难易暂不评价,毕竟会者不难,难者不会么。

CRC校验的根本思想是在要发送的帧之后附加⼀个数(CRC校验值),⽣成⼀个新帧,然后发送给接收端。

当然,这个附加的数并不是随意的,他要使新⽣成的帧能在发送端和接收端选定的某个特定的数整除。

当然,这个特定的数和整除的⽅法也不是随意的,特定的数是经过多次论证选定的⼀些列数,这在之后会述说,整除的⽅法是模2除法。

模2除法(crc原理最核⼼的思想)模2除法与算术除法类似,都是除法,不同的是,除的时候既不向上借位,也不⽐较除数和被除数的⼤⼩,只要以相同的位数进⾏相除即可。

模2加法:1+1=0,0+1=1, 0+0=0,⽆进位也⽆借位;模2减法:1-1=0, 0-1=1,0-0=0,也⽆进位,⽆借位,相当于⼆进制中的异或运算。

即⽐较后,相同为0,相异为1。

如100101除以1110,结果的商为11,余数为1.关于模2除法中除数的选择,这个你可以⾃⼰随意选择,开玩笑的,随意选择的除数,会导致帧校验的正确率下降,这是不确定的,要看你选择的除数。

⽽我们⼀般的除数的选择是直接去参照⼀些专家讲过多次试验下来的⼀些除数,这些除法能极⼤的保证帧校验的正确率。

⼀般⽽⾔crc8校验的错误率为1/256,crc16校验的错误率为1/65536,crc32校验的错误率为1/(65536*65536).那这⾥就有⼀个问题,我们传送的是⼀串字节数据,⽽不是⼀个数据,怎么将⼀串数字变成⼀个数据呢?这也很简单,⽐如说2个字节B1,B2,那么对应的数就是(B1<<8)+B2;如果是3个字节B1,B2,B3,那么对应的数就是((B1<<16)+(B2<<8)+B3),⽐如数字是0x01,0x02,0x03,那么对应的数字就是0x10203;依次类推。

如果字节数很多,那么对应的数就⾮常⾮常⼤,不过幸好CRC只需要得到余数,⽽不需要得到商。

CRC校验原理及步骤

CRC校验原理及步骤

CRC校验原理及步骤标准化管理处编码[BBX968T-XBB8968-NNJ668-MM9N]CRC校验原理及步骤什么是CRC校验CRC即循环冗余校验码:是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定。

循环冗余检查(CRC)是一种数据传输检错功能,对数据进行多项式计算,并将得到的结果附在帧的后面,接收设备也执行类似的算法,以保证数据传输的正确性和完整性。

CRC校验原理:其根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。

当然,这个附加的数不是随意的,它要使所生成的新帧能与发送端和接收端共同选定的某个特定数整除(注意,这里不是直接采用二进制除法,而是采用一种称之为“模2除法”)。

到达接收端后,再把接收到的新帧除以(同样采用“模2除法”)这个选定的除数。

因为在发送端发送数据帧之前就已通过附加一个数,做了“去余”处理(也就已经能整除了),所以结果应该是没有余数。

如果有余数,则表明该帧在传输过程中出现了差错。

模2除法:模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。

在循环冗余校验码(CRC)的计算中有应用到模2除法。

例:CRC校验步骤:CRC校验中有两个关键点,一是预先确定一个发送送端和接收端都用来作为除数的二进制比特串(或多项式),可以随机选择,也可以使用国际标准,但是最高位和最低位必须为1;二是把原始帧与上面计算出的除数进行模2除法运算,计算出CRC码。

具体步骤:1. 选择合适的除数2. 看选定除数的二进制位数,然后再要发送的数据帧上面加上这个位数-1位的0,然后用新生成的帧以模2除法的方式除上面的除数,得到的余数就是该帧的CRC校验码。

注意,余数的位数一定只比除数位数少一位,也就是CRC校验码位数比除数位数少一位,如果前面位是0也不能省略。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

快速CRC逆序校验方法
作者:梁海华盘丽娜
来源:《计算机应用》2013年第07期
文章编号
摘要:
循环冗余校验(CRC)是计算机网络中常用的冗余校验方法。

针对现有的正序(FIFO)校验方法只能对编码寄存器为零初始状态时生成的校验值正确校验的问题,提出一种逆序(LIFO)校验方法。

首先,使用状态矩阵对两类串行编码电路进行分析,理论上证明状态矩阵可逆,由逆矩阵变换得出串行逆序校验方法及其电路;通过电路分析,可将串行逆序方法扩展为快速并行逆序方法,无须预补零操作,简化了计算流程。

通过实例计算,验证了并行逆序方法能够对任意初始状态生成的校验值正确校验;仿真结果表明该方法具有与并行正序校验方法近似的运算速度。

关键词:循环冗余校验;先进先出;初始状态;后进先出;运算速度
中图法分类号:TP393文献标志码:A
英文标题
英文作者名
英文地址(
School of Computer Science and Engineering, Changshu Institute of Technology, Changshu Jiangsu 215500, China英文摘要
Abstract:
Cyclic Redundancy Check (CRC) has already been used in the field of computer network widely. Since the existing First In First Out (FIFO) method can only decode checksum which is encoded when
First Out (LIFO) method was proposed. First of all, by analyzing two kinds of serial encoding circuit based on transition of state matrix, the authors
theoretically proved the matrix was invertible, and serial LIFO method and its circuit could be derived. Depending on serial method, rapid parallel LIFO method was given, in no need of dummy bits, thus simplifying the calculation process. A case study verified the correctness of this method when
The simulation results show that FIFO and LIFO have similar calculation speed.
Cyclic Redundancy Check (CRC) has already been used in the field of computer network widely. Existing First In First Out (FIFO) method can only decode checksum which is encoded when initial register’s state is zero, a Last In First Out (LIFO) method is proposed. First of all, by analyzing two kind of serial encoding circuit based on transition of state matrix, the authors theoretically proved the matrix was invertible, serial LIFO method and its circuit could be derived. Depending on serial method, rapid parallel LIFO method was given, no needing dummy bits, simplifying the calculation process. Example verified the correctness of this method when decoding checksum, no matter what initial register’s state was. The simulation results show that FIFO and LIFO have similar performance of calculation speed.
英文关键词
Cyclic Redundancy Check (CRC); First In First Out (FIFO); initial state; Last In First Out (LIFO); calculation speed
0 引言
目前,在计算机通信领域,由于数据在传输或存储过程中会受到各种干扰产生误码,从而需要进行数据校验来确保数据的完整性,循环冗余校验(Cyclic Redundancy Check, CRC)是一种常用的方法[1-2],Peterson等提出了两种串行编码电路[3],Giuseppe等
[4]和Cheng等[5]分别从不同的角度提出了并行编码方式;为了破解软件中CRC
校验值的保护,Stigge等从串行编码计算方法角度提出了一种按位进行的CRC逆向求解方法[6]。

本文从编码电路状态分析入手提出一种并行的快速CRC逆序校验方法;解决现
有CRC校验方法只能判定编码电路零初始状态时生成的校验值是否正确的问题;解决现有方
法中需预先填零操作,使得处理数据长度是并行处理位宽整数倍的问题[7],提高处理的实时性。

一般编码及校验方法:发送信息序列-对应多项式为
--,生成多项式
--,校验序列
对应多项式为----,发送序列;接收序列
,如果无差错接收,则,否则出
错。

图1为现有级串行CRC编码器的结构示意图,寄存器初始状态一般情况下为全零(即零初态);图2为现有级串行CRC解码器结构示意图,解码器为零初态。

相关文档
最新文档