超級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”呢?
因為它非常了對校驗和驗證的分支!即對校驗和判斷的程序,故阻止或加大難度了逆向工程。
特別指出,當明文長度不為權值長度的整數倍時,即最后一組明文長度小于權值長度,故初值和明文不滿足交換律,故沒有逆運算。
此時的初值,攻防雙方都必須用正運算對初值進行窮舉!以求出初值。
強烈推薦利用出值碰撞保護版權信息時,明文長度不要選擇是權值長度的整數倍!