- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
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。
二进制减法运算的规则是,如果遇到 0-1 的情况,那么要从高位借 1,就变成了(10+0)-1=1,
这里的 10 是二进制数,相当于十进制的 2。CRC运算有什么不同呢?让我们看下面的例子:
这次用式子 30 / 9,不过请注意最后的余数:
11110 -- 30
1001 - -- 9
1100 -- 12 (很奇怪吧?为什么不是 21 呢?)
1001 - -- 9
101 -- 5,余数 -- the CRC!
这个式子的计算过程是不是很奇怪呢?它不是直接减的,而是用 XOR 的方式来运算(程
序员应该都很熟悉 XOR吧),最后得到一个余数。对啦,这个就是 CRC的运算方法,明白了
吗?CRC 的本质是进行 XOR 运算,运算的过程我们不用管它,因为运算过程对最后的结果没
1
沈阳单片机开发网——帮您精确掌握电子器件的使用细节
有意义;我们真正感兴趣的只是最终得到的余数,这个余数就是 CRC值。
进行一个 CRC 运算我们需要选择一个除数,这个除数我们叫它为“poly”,宽度 W 就是
最高位的位置,所以我刚才举的例子中的除数 9,这个 poly 1001的 W是3,而不是 4,注
意最高位总是 1。(别问为什么,这个是规定)
如果我们想计算一个位串的 CRC 码,我们想确定每一个位都被处理过,因此,我们要在
目标“位串”后面加上 W 个0 位。现在让我们根据 CRC 的规范来改写一下上面的例子:
Poly = 1001,宽度 W = 3
位串 Bitstring = 11110
Bitstring + W zeroes = 11110 + 000 =
1001|||| -
1100|||
1001||| -
1010||
1001|| -
0110|
0000| -
文档评论(0)