论文网
English Papers
万事OK网
发表论文
 
 首页 > IT文章 > 程序设计 >
CRC算法原理及C语言实现

[科技论文网] http://www.scipapers.com    2007-12-01  

    CRC算法原理及C语言实现

    作者:tuyer      来源:tuyer.cublog.cn     发表时间:2006-10-10     浏览次数: 45466      字号:    

    CRC原理介绍:
     CRC的英文全称为Cyclic Redundancy Check(Code),中文名称为循环冗余校验(码)。它是一类重要的线性分组码,编码和解码方法简单,检错和纠错能力强,在通信领域广泛地用于实现差错控制。 


         CRC计算与普通的除法计算有所不同。普通的除法计算是借位相减的,而CRC计算则是异或运算。任何一个除法运算都需要选取一个除数,在CRC运算中我们称之为poly,而宽度W就是poly最高位的位置。比如poly 1001的W是3,而不是4。注意最高位总是1,当你选定一个宽度,那么你只需要选择低W各位的值。假如我们想计算一个位串的CRC码,并要保证每一位都要被处理,因此我们需要在目标位串后面加上W个0。下面举例说明CRC算法的过程。

         在此例中,我们假设位串为110101101。

    Poly                     = 10011(宽度W = 4)
    Bitstring + W zeros = 110101101 0000

    10011/1101011010000/110000101 (我们不关心此运算的商)
          10011|||||||| 
           -----||||||||
            10011|||||||
            10011|||||||
             -----|||||||
              00001||||||
              00000||||||
               -----||||||
                00010|||||
                00000|||||
                 -----|||||
                  00101||||
                  00000||||
                   -----||||
                    01010|||
                    00000||| 
                     -----|||
                      10100||
                      10011||
                       -----||
                        01110|
                        00000|
                         -----|
                         11100
                         10011
                          -----
                           1111 -> 余数 -> CRC!

    计算过程总结如下:
    1. 只有当位串的最高位为1,我们才将它与poly做XOR运算,否则我们只是将位串左移一位。
    2. 异或运算的结果实质上是被操作位串与poly的低W位进行运算的结果,因为最高位总为0。
     

     

    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=0
        1010-     1111+ 1111-     0+1=1 *0-1=1
        ----      ----  ----      1+0=1  1-0=1
        0011      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\13
         1001    -                    09  -|    来源:

声明:本文由网友推荐或作者提交,版权归原作者所有,刊登此文仅为传播知识,展示研究成果,提高文章引用率。未经原作者授权,禁止用于任何形式的商业行为。科技论文网倡导尊重知识、尊重劳动、保护原创、知识共享。由于部分论文文章来于网络,文章作者不祥,请相关的原创作者与我们联系,以便加上您的署名。

1 2 3 4 5 6 7 8 9 下一页  
CRC算法原理及C语言实现
下面没有链接了     欧几里德算法及其实现
最新论文
·[程序设计]CRC算法原理及C语言实现
·[程序设计]欧几里德算法及其实现
·[程序设计]蚁群算法Python实现
·[程序设计]图像二值化算法源码
·[程序设计]经典面试问题:12小球问题算法2
·[程序设计]经典面试问题:12小球问题算法
·[程序设计]图像几何变换插值算法
·[程序设计]C算法—堆排序
·[程序设计]人机博弈程序实现
·[程序设计]A*算法Python实现
 
 

搜索论文

Google
论文分类

论文网 论文发表网 论文 免费论文网 找论文网 毕业论文 中国论文网 英语论文 百度论文 聘教网 易搜
 免费发布论文    中国论文网 2008版权所有  业务联系:pinjiao@126.com