http://bbs.pediy.com/showthread.php?t=99977
像 '1234' 的 CRC32 为 9BE3E0A3
我试过 长度=4 的明文 只有 '1234'
菜农回答:此话是对的,它即为"CRC签名"
但长度=5的明文有256个, 例如下列几个明文 (十六进制), 其CRC32都是 9BE3E0A3:
20 74 FD 5F DD
21 E2 CD 58 AA
22 58 9C 51 33
23 CE AC 56 44
24 6D 39 32 DA
25 FB 09 35 AD
26 41 58 3C 34
27 D7 68 3B 43
28 46 75 84 D3
29 D0 45 83 A4
2A 6A 14 8A 3D
2B FC 24 8D 4A
长度=16 的明文只有下列一组附合 CRC32=9BE3E0A3
00 00 00 00 00 00 00 01 CE DD 16 26
菜农注解:此话天大的错误!!!
00 00 00 00 00 00 00 01 CE DD 16 26实际长度为12,因为它大于4个字节,故有2^(12-4)次碰撞!!!
输入:0000000000000001CEDD1626
输出:DEBB20E3EDDA1000641C1F5C 结果:9BE3E0A3
攻击位XXXXXXXXXXXXXXXX641C1F5C
菜农开始攻击!
输入:FFFFFFFF00000000CECDCCCB
输出:0000000000000000641C1F5C 结果:9BE3E0A3
输入:E075C51A0E9B2BF4DFDCDDDA
输出:1111111111111111641C1F5C 结果:9BE3E0A3
输入:9D0AD96D9D0AD96D31323334
输出:FFFFFFFFFFFFFFFF641C1F5C 结果:9BE3E0A3
现在再选择16位攻击(2^(16-4)次碰撞):
输入:FFFFFFFF0000000000000000CECDCCCB
输出:000000000000000000000000641C1F5C 结果:9BE3E0A3
输入:9D0AD96D9D0AD96D9D0AD96D31323334
输出:FFFFFFFFFFFFFFFFFFFFFFFF641C1F5C 结果:9BE3E0A3
哈哈~~~现在看出来了吧,碰撞次数一定是个“天文数字”~~~
所以,菜农搞得“CRC任意碰撞”是“可以预测的”
当CRC输入位数=CRC权值即多项式时,此CRC将无任何碰撞发生,此时的CRC可用于数字签名。
这样的无碰撞机制的CRC与MD5等号称无碰撞的散列函数最大的不同:
线性,绝对无碰撞而非号称,因为此时全部的数据都在一个CRC编码矩阵中。
可逆,但必须知道权值和初值及出值和方向。
而MD5是由4个特定数据和4种非线性函数组成的,但它已被发现有MD5碰撞,所以签名是不可靠的,
虽然MD5的碰撞概率很小。
而CRC的碰撞概率是已知的,即2^(输入字节数-CRCN字节).
当输入字节数==CRCN字节时,无CRC碰撞,
当输入字节数<CRCN字节时,有1次CRC碰撞(和CRCN等长的必有一个)
故CRC要用于数字签名,只要满足输入字节数==CRCN字节即可,但它的缺点是有CRC密钥(权、方向、出入值)
此种情况下,出值可以恒为0,只要知道权值和初值即可简化CRC密钥。故有“CRC密钥碰撞”。
菜农虽然不知什么原因CRC128被MD5等散列函数所替代,但菜农坚信CRC256,CRC512,CRC1024一定不会比MD5弱~~~
只是计算机位数的限制,实际CRCN可逆算法可以让N为无穷大。
菜农的HotWC3已满足内核任意CRCN变化,因为CRC位域N可以随意调整。
从HotWC3运算器支持位域4即可输入半字节可以看出菜农说的绝非梦话~~~只是俺的知音太少~~~
或用菜农的三点攻击法则,但必须知道特定三组的明文与密文对,或更多的明文与密文对来攻击CRC权值。