CRC编解码矩阵见:http://bbs.pediy.com/showthread.php?t=93844
可以看到用CRC编解码矩阵的概念更容易实现“CRC碰撞”
网上的一个求助帖:求生成的CRC64编码完全相同的两个串
我们可以做2个CRC64(左移):
设CRC64权(左移)=0x42F0E1EBA9EA3693 CRC64校验和=0x012345678ABCDEF
要求:
CRC64明文1=0x1122334455667788
CRC64明文2=0x8877665544332211
那么CRC64的2个初值为多少???
因为CRC64的初值我们无法立即得到,但我们可以间接得到:
在CRC正运算即CRC编码(对称)矩阵中,初值和明文可以相互交换。
在CRC逆运算即CRC解码(非对称)矩阵中,密文和初值锁定明文,密文和明文锁定初值。
故CRC64的初值1:
CRC64权=0x42F0E1EBA9EA3693
CRC64初值1=0x1122334455667788(先用明文1替代)
CRC64校验和=0x012345678ABCDEF(就是密文1或密文2)
求CRC64的逆运算即查CRC64的解码表,得到
CRC64明文1=0x2D6FD3ADE7D797FD(此时是逆运算时的明文)
故CRC64初值1=0x2D6FD3ADE7D797FD和CRC64明文1=0x1122334455667788
在CRC64权=0x42F0E1EBA9EA3693时的校验和=0x012345678ABCDEF
同理:
CRC64初值2=0xB43A86BCF682C264和CRC64明文2=0x8877665544332211
在CRC64权=0x42F0E1EBA9EA3693时的校验和=0x012345678ABCDEF
从以上2个例子可以看出:
CRC密码的密钥虽然由初值、权及方向组成,一旦权和方向确定后,初值、明文即密文
三者的关系只要知道两者即可求解出第三者。
故CRC密码的安全之关键在于对CRC权及方向的保护,即对CRC编解码矩阵的保护。
以上问题都归为一般的“CRC碰撞”,即权确定时的CRC碰撞。
若用其它CRC元素求解CRC权,则属于“CRC密钥碰撞”。
以CRC8密钥为例,它有2^16,其中初值2^8,(权+方向)为2^8.
(权+方向)对应1个矩阵,故有2^8次“CRC密钥碰撞”。
但是CRC密钥不确定时,最多只能发生一次“CRC密钥碰撞”。
即其它CRC元素所对应的权即编解码矩阵就不存在。 |