首页
社区
课程
招聘
[求助]关于CRC32
发表于: 2008-2-26 21:50 6617

[求助]关于CRC32

2008-2-26 21:50
6617

我想知道一些关于CRC32的知识

很了解的人帮忙给我讲解下  谢谢了
我现在很需要~!!  能给我将明白万分感谢啊~!


[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 7
支持
分享
最新回复 (4)
雪    币: 6154
活跃值: (4777)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
2
(我解不了你的疑,但我可以给你一个起点,如果你最终能解答我的那个疑问,务必请你教一下我,先谢过)

Ross N. Williams写过一份非常棒的文档([1])介绍CRC(Cyclic Redundancy Code)原
理。CRC的基本思路是多项式长除法。

先回忆一下小学数学中的10进制长除法:

       77
   +------
74 ) 5751
     518
     ---
      571
      518
      ---
       53

被除数  : 5751
除数    : 74
商      : 77
余数    : 53

与之类似的2进制长除法如下:

          10101101
     +------------------
1001 ) 11000010111
       1001
       ----
        0110
        0000
        ----
         1100
         1001
         ----
          0111
          0000
          ----
           1110
           1001
           ----
            1011
            1001
            ----
             0101
             0000
             ----
              1011
              1001
              ----
               010

被除数  : 11000010111   : 1519
除数    : 1001          : 9
商      : 10101101      : 173
余数    : 010           : 2

将2进制长除法过程中的"借位减法运算"换成"不借位的异或运算",就是传说中的多
项式长除法:

          1011
     +---------
1101 ) 1111111
       1101
       ----
        0101
        0000
        ----
         1011
         1101
         ----
          1101
          1101
          ----
           000

被除数  : 1111111
除  数  : 1101
商      : 1011
余  数  : 000

换个方式抽象表述上面这些数字(^表示乘方):

被除数  : x^6 + x^5 + x^4 + x^3 + x^2 + x^1 + x^0
除  数  : x^3 + x^2 + x^0
商      : x^3 + x^1 + x^0
余  数  : 0

看得出,0/1对应了多项式各次项的系数。最终的多项式长除法如下:

                              x^3 + x^1 + x^0
                +-----------------------------------------
x^3 + x^2 + x^0 ) x^6 + x^5 + x^4 + x^3 + x^2 + x^1 + x^0
                  x^6 + x^5 + x^3
                  ---------------
                        x^4 + x^2 + x^1 + x^0
                        x^4 + x^3 + x^1
                        ---------------
                              x^3 + x^2 + x^0
                              x^3 + x^2 + x^0
                              ---------------
                                            0

多项式长除法的实质是对各次项系数做模2减法,注意-1模2后是1。这种模2减法就是
异或运算。

原始数据    : 1101011011
除数        : 10011(生成多项式,5个2进制位)
被除数      : 11010110110000(在原始数据后添加0,0的个数比除数的2进制位数少1)

进行多项式长除法运算:

            1100001010
      +----------------
10011 ) 11010110110000
        10011
        -----
         10011
         10011
         -----
          00001
          00000
          -----
           00010
           00000
           -----
            00101
            00000
            -----
             01011
             00000
             -----
              10110
              10011
              -----
               01010
               00000
               -----
                10100
                10011
                -----
                 01110
                 00000
                 -----
                  1110  <= CRC

原始数据    : 1101011011
除数        : 10011(生成多项式,5个2进制位)
被除数      : 11010110110000(在原始数据后添加0,0的个数比除数的2进制位数少1)
商          : 1100001010(我们不关心商)
余数        : 1110(针对原始数据的CRC)
最终数据    : 11010110111110(原始数据+CRC)

如何选择生成多项式是个学问,对于我们来说,无需关心数学理论问题,下面是一些
现实世界使用的生成多项式:

X25         : x^16 + x^12 + x^5 + x^0
            : (16,12,5,0)
CRC-16      : x^16 + x^15 + x^2 + x^0
            : (16,15,2,0)
Ethernet    : x^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^1 + x^0
            : (32,26,23,22,16,12,11,10,8,7,5,4,2,1,0)

CRC算法的优化实现对我来说比较晦涩,大学学的东西早已还给老师,故就不误人子
弟似的在此介绍CRC算法优化背后的数学原理了。Sven Reifegerste提供了一份精彩
的C代码,演示了四种实现([11])。

> CRC32 "1314"

Plain   : 31 33 31 34
CRC32   : 0xA817E816

CRC32.c算出来的CRC32值与很多现成工具算出来的相一致。试图手工进行多项式长除
法得到这个结果,但总是得不到。很想知道如何通过多项式长除法得到结果,就算是
涉及一些二进制位的反序处理,也给我一个针对"\x31\x33\x31\x34"的手工计算例子
吧。可惜天下文章一大抄,没找到可答疑解惑的文章。

[ 1] A PAINLESS GUIDE TO CRC ERROR DETECTION ALGORITHMS
     92bK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0W2M7r3q4A6M7X3k6S2M7g2)9J5k6h3!0J5k6#2)9J5c8X3k6A6L8r3W2H3k6#2)9J5c8V1I4u0e0V1E0Q4x3V1k6r3i4K6g2X3j5%4u0U0i4K6g2X3N6U0x3I4i4K6u0W2K9s2c8E0L8l9`.`.
     0e3K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0W2M7r3q4A6M7X3k6S2M7g2)9J5k6h3!0J5k6#2)9J5c8X3k6A6L8r3W2H3k6#2)9J5c8V1I4u0e0V1E0Q4x3V1k6r3i4K6g2X3j5%4u0U0i4K6g2X3N6U0x3J5i4K6u0W2K9s2c8E0L8l9`.`.
     493K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0W2M7r3q4A6M7X3k6S2M7g2)9J5k6h3!0J5k6#2)9J5c8X3k6A6L8r3W2H3k6#2)9J5c8V1I4u0e0V1E0Q4x3V1k6r3i4K6g2X3j5%4u0U0i4K6g2X3N6U0x3K6i4K6u0W2K9s2c8E0L8l9`.`.
     368K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0W2M7r3q4A6M7X3k6S2M7g2)9J5k6h3!0J5k6#2)9J5c8X3k6A6L8r3W2H3k6#2)9J5c8V1I4u0e0V1E0Q4x3V1k6r3i4K6g2X3j5%4u0U0i4K6g2X3N6U0x3@1i4K6u0W2K9s2c8E0L8l9`.`.
     17eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4u0W2M7r3q4A6M7X3k6S2M7g2)9J5k6h3!0J5k6#2)9J5c8X3k6A6L8r3W2H3k6#2)9J5c8V1I4u0e0V1E0Q4x3V1k6r3i4K6g2X3j5%4u0U0i4K6g2X3N6U0x3#2i4K6u0W2K9s2c8E0L8l9`.`.
     (前半截讲解的非常清楚,后半截还是比较晦涩)

[11] 391K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3N6H3k6X3&6Q4x3X3g2K6K9#2)9J5k6h3y4S2i4K6u0r3i4K6N6q4M7X3S2Y4i4K6u0r3j5%4y4U0z5o6f1#2x3s2x3H3x3W2)9J5c8X3y4J5j5%4c8W2M7%4c8W2M7W2)9J5k6h3y4Q4x3U0S2U0L8$3!0D9i4K6t1&6
     755K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4A6G2M7X3y4Q4x3X3g2T1M7X3g2A6N6r3u0S2L8X3c8C8j5i4c8*7k6g2)9J5k6h3c8W2i4K6u0r3j5%4u0U0N6r3g2K6N6r3g2J5i4K6u0W2j5H3`.`.
2008-2-27 08:48
0
雪    币: 437
活跃值: (518)
能力值: ( LV12,RANK:240 )
在线值:
发帖
回帖
粉丝
3
http://bbs.pediy.com/showthread.php?t=40938
2008-2-27 12:42
0
雪    币: 6154
活跃值: (4777)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
4
楼上这位,请教你一个问题。

原始数据"\x31\x33\x31\x34",我想知道如何通过"手工"多项式长除法得到数值
0xA817E816。

能给个原理性"手工"演示吗?多谢。

BTW,如果是那些个现成的C、ASM代码,就不必给了,全干过。
2008-2-27 13:11
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
看过还不是很明白的!
2008-3-2 12:13
0
游客
登录 | 注册 方可回帖
返回