原帖出处:http://bbs.pediy.com/showthread.php?t=93139
一. 用HotWC3/CRC网上演算器任意制造CRC碰撞
CRC碰撞对菜农来说实际是个"CRC的逆运算"~~~没网上帖子搞得如此复杂。
以下计算工具皆来自"HotWC3/CRC网上演算器"(采用小端模式)
假设选定CRC8=X8+X2+X1+1,即初值=0,权=0x07,左移
若明文即需要校验的数据为0x12,0x34
则CRC8和校验和为0xf1.
要制造“CRC碰撞”,即用另一明文流再做CRC8运算且校验和也为0xf1.
我们可以操作"HotWC3/CRC网上演算器"的“计算钮”后发现:
“密文流”此时为“7EF1”,即0x7e,0xf1.注意它尾部的“密文”0xf1实际也是CRC校验和。
在CRC密钥即初值、权及方向一定时,我们可以改写密文流且尾部的“校验和”保留制造“碰撞”
这样,密文流只要改写0x7e为任意值即可,假如改写为0x88.即密文流为"88F1"
操作"HotWC3/CRC网上演算器"“还原钮”后发现:
明文变为"59C2",即0x59,0xc2和0x12,0x34得到的CRC8的“校验和”都为0xf1~~~
不信可对明文"59C2"进行“计算”看看~~~
同理,还有其他254个“CRC碰撞”在等着你~~~
假若明文流长度加大,那麽“CRC碰撞”会迅速增加。
例如:明文流:“12345678”,CRC和为0x1c.
那么会产生2^56组“CRC碰撞”~~~
如:“12345363”,“12345476”,“12345571”,“1234577F”,“12345852”,...“06AD9D52”,“17CBFB25”....
所以,"HotWC3/CRC网上演算器"是很好的“CRC碰撞”即"CRC逆向"工具~~~
“CRC碰撞”好像“选择密文攻击”吧~~~
可惜CRC运算不能作为CRC密码~~~
二. 如何“人造”CRC碰撞???
还以明文“1234”和“12345678”为例,菜农来讲解如何“人造碰撞”。
可惜本坛的网页在vista下不能上传图片,十分之郁闷~~~
就模拟HotWC3密码网上在线演算器吧
初值:00 输入:1234 CRC:F1
加权:07 输出:7EF1
点击“CRC表”,可以从第2行看到:70 77 7E 79...
它表示输入为10时,对应输出为70,11对应77,12对应7E,13对应79
故有:
初值:00 输入:103A CRC:F1
加权:07 输出:70F1
初值:00 输入:113D CRC:F1
加权:07 输出:77F1
初值:00 输入:103A CRC:F1
加权:07 输出:70F1
初值:00 输入:1234 CRC:F1
加权:07 输出:7EF1
初值:00 输入:1333 CRC:F1
加权:07 输出:79F1
这个例子估计有人明白了~~~“人造碰撞”实际很简单,不过下面的有点难度。
初值:00 输入:12345678 CRC:1C
加权:07 输出:7EF17C1C
如果我们想“碰撞”最小,即保留明文流不变的位数最小,“水平最高”也只有“12345XXX”了。
由于CRC“上次的密文是本次的权”,故保留:
初值:00 输入:12345XXX CRC:1C
加权:07 输出:7EF1XX1C
又CRC是“流加密”,故(注意初值的变化,此时和上例就一样了):
初值:F1 输入:5XXX CRC:1C
加权:07 输出:XX1C
点击“CRC表”,可以从第6行看到:6E,69,60,67,72,75,7C,7B...
它表示输入为50时,对应输出为6E,51对应69,52对应60,...56对应7C,57对应7B
故有:
初值:F1 输入:506A CRC:1C
加权:07 输出:6E1C
初值:F1 输入:516D CRC:1C
加权:07 输出:691C
初值:F1 输入:5264 CRC:1C
加权:07 输出:601C
初值:F1 输入:5678 CRC:1C (就是例子)
加权:07 输出:7C1C
初值:F1 输入:577F CRC:1C
加权:07 输出:7B1C
也就是:
初值:00 输入:1234506A CRC:1C
加权:07 输出:7EF16E1C
初值:00 输入:1234516D CRC:1C
加权:07 输出:7EF1691C
初值:00 输入:12345264 CRC:1C
加权:07 输出:7EF1601C
初值:00 输入:12345678 CRC:1C (就是例子)
加权:07 输出:7EF17C1C
初值:00 输入:1234577F CRC:1C
加权:07 输出:7EF17B1C
三. CRC碰撞带来的灾难及预防
在数据通信中,特别是无线或单总线通讯中,由于外部各种干扰,可能会使CRC校验失误。
还以上例为例子:
初值:00 输入:12345678 CRC:1C
加权:07 输出:7EF17C1C
假若干扰的原因,数据被“插入”了8个比特位,即“12345X678”
由于一般协议以“块”为单位,就造成:
初值:00 输入:12345X67 CRC:1C
加权:07 输出:7EF1XX1C
如何消除这种灾难呢???
答案:可以在每个通讯包后加发CRC结果一个字节。
因为CRC有个“性质”,密文流的最后一个字节即为CRC结果,若在明文流尾再加入此字节(上一密文)。
则CRC结果恒为0.
即正常时:
初值:00 输入:123456781C CRC:00
加权:07 输出:7EF17C1C00
当“插入干扰”来临时,即“12345X6781C”
有:
初值:00 输入:12345X6781 CRC:XX 肯定不为0
加权:07 输出:7EF17XXXXX
当然这种方法不能阻止“人造干扰”即逆向活动,但在通讯中是很有效果的~~~ |