COM盾中的反篡改(无碰撞)机制
COM盾的反篡改机制采用双CRC初值正反向保护机制,以CRC8保护为例,数据流如下(XX为正向初值,YY为逆向初值,1234ABCD是需要保护的数据,XXYY位置任意):
1234XXYYABCD
算法:CRC8_PEC=CRC8L_07_00_00
正向数据为1234ABCD,初值XX为8F(运算不包含XXYY),校验和为00。
反向数据为CDAB8F3412,初值YY为65(运算包含XX不包含YY),校验和为00。
12348F65ABCD(正向初值8F,不包括8F65,校验和00)
CDAB658F3412(反向初值65,不包括65校验和00)
安全性检测(根据CRC碰撞原理)
在正向初值8F保持不变时,正向数据流1234ABCD至少要有两个字节的数据同时发生变化,即有可能发生碰撞,即伪造数据。
CRC碰撞次数(不是碰撞概率)是可以准确地给出,即(数据长度-1)*256。
例如数据长度为1时,不会发生碰撞。
数据长度为2时,将会有256次,数据长度为3时,将会有512次。
故CRC碰撞是可以事先预测的,没有网上的“概率论”之说。
参见www.hotcrc.com, 点击“CRC碰撞”,可以任意制造CRC碰撞。
下面对数据12348F65ABCD进行碰撞测试,其中8F65是隐藏的正向初值和逆向初值,用于验证必须放在数据流中。
下面给出三组随机碰撞数据(8F65不变)。
AD388F658243(正向初值8F,不包括8F65,校验和00)
0E0A8F655055(正向初值8F,不包括8F65,校验和00)
7F978F654328(正向初值8F,不包括8F65,校验和00)
因为这些碰撞都是正向运算的,故正向校验和都恒为零。
4382658F38AD(反向初值65,不包括65,校验和65)
5550658F0A0E(反向初值65,不包括65,校验和4E)
2843658F977F(反向初值65,不包括65,校验和21)
上面三个逆向运算校验和都非零全部错误,虽然可以满足正向初值8F制造碰撞,但碰撞后绝对无法同时再满足逆向初值65的再碰撞,即无法满足两次碰撞。
故有结论:
对被保护的数据进行正向和逆向两次CRC运算后,在理论上可以100%阻止碰撞的发生。
所以,COM盾中的反篡改(无碰撞)机制在理论上是无法篡改的。
虽然可以同时修改正向初值和逆向初值,但是是唯一的,即无碰撞的。
例如采用CRC32双初值和CRC64校验和这两种方法比对,前者是无碰撞的,而后者是有碰撞的,虽然位数很多。
即这两种方法存放的位数相同,但安全强度是不同的。
CRC碰撞测试网站:www.hotcrc.com
打开网页,直接点击“CRC碰撞”,显示“CRC逆运算结果=XXXXXXXXXXXXXXXX”,因为菜农采用的是CRC逆运算制造任意CRC碰撞,再点击“运算”可以看到CRC校验和没变,即验证了碰撞的发生。
不信你可以试试看~~~
菜农HotPower@163.com 2022.09.13 于西安雁塔菜地
|