如何手工计算0x31333134的CRC-32值?
献给那些永远充满着好奇心的人们
有些答案永远在二进制洪流中飘
[前言]
这几天,分析某软件算法时,涉及到CRC。在重拾记忆碎片时,发现有网友提出一个问题:如何手工计算0x31333134的CRC-32值。我乐于接受这个挑战。因为此任务可以强化我的记忆。(虽然已经我的大脑证明,2年前写的东西我已经可以全部忘光。但愿这次,我可以记得更久一些。)
[过程]
CRC-32标准有着各种各样的变形,下面的参数集定义的是最常见的一个,也是本文中采用的CRC-32算法。
―――――――――――――――――― [Ross93]
Name : "CRC-32"
Width : 32
Poly(Reverse) : 04C11DB7( EDB88320 )
Init : FFFFFFFF
RefIn : True
RefOut : True
XorOut : FFFFFFFF
Check : CBF43926
――――――――――――――――――
[预备知识1]
最常见的一种解决方案
little-endian CPU
------------
每一个字节内,相对低位的比特位是多项式中的相对高位的系数;
每一个机器字内,相对低位的字节是多项式中的相对高位的系数。
------------
big-endian
------------这样来表述:
每一个字节内,相对低位的比特位是多项式中的相对高位的系数;
每一个机器字内,相对高位的字节是多项式中的相对高位的系数。
------------
每一次模2除法的被除数:上一次模2除法的余数+上一次未参与运算的被除数的低位
模2除法的余数总比除数少1位。
polynormical arithmetics多项式运算,特指没有进位的多项式加法和乘法、没有借位的多项式减法和除法。
模n多项式运算:对运算结果的各项系数进行模n运算,运算过程中各项系数的加减执行模n加、模n减。
Step I. 被除数是什么?
0010 1100 1000 1100 1100 1100 1000 1100 … …
+ 1111 1111 1111 1111 1111 1111 1111 1111 … …
=
1101 0011 0111 0011 0011 0011 0111 0011 … …(这就是被除数)
注I. … …表示跟在后面的无穷字节
0x31333134在CRC, Little-endian的语境中,要表示成多项式的话,应该所有n比特位与所有的32-n比特位互调位置,结果如下
3 1 3 3 3 1 3 4
0011 0001 0011 0011 0011 0001 0011 0100
->
0010 1100 1000 1100 1100 1100 1000 1100
Init 值为FFFFFFFF,它表示上一次高位的模2除法运算的余数,理所当然要加到本次除法中。
Step II. 除数是什么?
1 0000 0100 1100 0001 0001 1101 1011 0111(这就是除数)
因为Poly(Reverse)的值为04C11DB7( EDB88320 ),表示成二进制数就是
0000 0100 1100 0001 0001 1101 1011 0111
在说明除数Poly时,一般省略了最高位32位的比特1。
所以,别忘了最高位32位的1,它保证了CRC-32的结果值为32位,...
Step III. 计算
记住,是无进位的多项式模2除法
被除数(后面的32个比特零仅仅是余数的占位符)
1101001101110011001100110111001100000000000000000000000000000000 … …
除数
100000100110000010001110110110111
过程-> 商,余数
-> 1,
101000100010011101111011010100010000000000000000000000000000000
-> 11,
01000000100011111110101100010101000000000000000000000000000000
-> 1101,
000001101111111010110001111000110000000000000000000000000000
-> 1101000001,
101110110110110101100101011101110000000000000000000000
-> 11010000011,
01110010000110111101011101011001000000000000000000000
-> 1101000001101
110011001010111001000000110100110000000000000000000
-> 11010000011011
10011101100111011001110000010001000000000000000000
-> 110100000110111
0011111111111010001001011001010100000000000000000
-> 110100000110111001
1111101100010000001100010001111100000000000000
-> 1101000001101110011
111100101110000101111111100010010000000000000
-> 11010000011011100111
11100001000000111110001010100101000000000000
-> 110100000110111001111
1100011011000110110110001111110100000000000
[注意]看雪招聘,专注安全领域的专业人才平台!