超级CRC计算器HotCRC中的CRC出值碰撞有什么用途?
HotCRC计算器中有多个碰撞,而目前官方的只有一个“CRC碰撞”,即不同的明文(待校验数据流),相同的结果(校验和)。
CRC出值碰撞是根据CRC逆运算,在明文不变,结果不变,指定出值后,逆运算出“初值”。
由于数字上将CRC校验划归为“单向散列函数”,故它在理论上是没有逆运算的。
但是菜农找到CRC的“陷门”后,即明文长度等于权值长度后,即可从“密文”中逆运算出“明文”。
由于明文和初值满足交换律,故在明文长度是权值长度的整数倍时,即最后一组明文长度等于权值长度时,此时初值可以用逆运算得到。
即可以用“CRC出值碰撞”求初值。
CRC出值碰撞最大的用途就是“保护版权信息”不受破坏。
在一般的CRC保护应用上,都是有明文和校验和两部分构成保护机制,它的依据就是CRC算法是不公开的,或是很难逆向的。
利用CRC出值碰撞保护原理:
令校验和恒为0,出值恒为0。已知被保护的明文,还有逆运算后的初值(由HotCRC求出)。
因为在保护程序里,运行的是CRC正运算,故对明文计算CRC后更为0。
然后用这个“0”到处异或,例如对LED或LCD字符串输出时异或这个“0”,字符输出不会发生变化即错误。
为何要这个“0”呢?
因为它非常了对校验和验证的分支!即对校验和判断的程序,故阻止或加大难度了逆向工程。
特别指出,当明文长度不为权值长度的整数倍时,即最后一组明文长度小于权值长度,故初值和明文不满足交换律,故没有逆运算。
此时的初值,攻防双方都必须用正运算对初值进行穷举!以求出初值。
强烈推荐利用出值碰撞保护版权信息时,明文长度不要选择是权值长度的整数倍!