回覆列表
-
1 # 雁塔菜農
-
2 # 雁塔菜農
CRC初值碰撞是在明文不變,結果不變,指定CRC初值後,“正運算”出CRC出值。
它的應用主要是設定初值和出值都不為特定值的CRC簡寫式。
特別是在明文不等長且明文長度不是權值長度的整數倍時,該不為特定值的這組初值和出值將是唯一的,故此時的CRC主要成員都是CRC
金鑰了,例如逆向CRC8,需要窮舉:
權值(256次)*方向(2次)*初值(256次)*出值(256次)
故當CRCn中的n足夠大時,其CRC演算法非常難以逆向或無法破逆向。
因為窮舉的時間成本太高,可能是百年或萬年等。
HotCRC計算器中有多個碰撞,而目前官方的只有一個“CRC碰撞”,即不同的明文(待校驗資料流),相同的結果(校驗和)。
CRC出值碰撞是根據CRC逆運算,在明文不變,結果不變,指定出值後,逆運算出“初值”。
由於數字上將CRC校驗劃歸為“單向雜湊函式”,故它在理論上是沒有逆運算的。
但是菜農找到CRC的“陷門”後,即明文長度等於權值長度後,即可從“密文”中逆運算出“明文”。
由於明文和初值滿足交換律,故在明文長度是權值長度的整數倍時,即最後一組明文長度等於權值長度時,此時初值可以用逆運算得到。
即可以用“CRC出值碰撞”求初值。
在一般的CRC保護應用上,都是有明文和校驗和兩部分構成保護機制,它的依據就是CRC演算法是不公開的,或是很難逆向的。
利用CRC出值碰撞保護原理:
令校驗和恆為0,出值恆為0。已知被保護的明文,還有逆運算後的初值(由HotCRC求出)。
因為在保護程式裡,執行的是CRC正運算,故對明文計算CRC後更為0。
然後用這個“0”到處異或,例如對LED或LCD字串輸出時異或這個“0”,字元輸出不會發生變化即錯誤。
為何要這個“0”呢?
因為它非常了對校驗和驗證的分支!即對校驗和判斷的程式,故阻止或加大難度了逆向工程。
特別指出,當明文長度不為權值長度的整數倍時,即最後一組明文長度小於權值長度,故初值和明文不滿足交換律,故沒有逆運算。
此時的初值,攻防雙方都必須用正運算對初值進行窮舉!以求出初值。