Hash

HOTP 為什麼要使用這麼複雜的截斷函式呢?

  • June 13, 2013

HOTP協議中,計算 20 字節雜湊後,它被截斷為 4 字節。

首先計算偏移量(最後一個字節的低 4 位),確定要選擇的四個字節:

DT(String) // String = String[0]...String[19]
 Let OffsetBits be the low-order 4 bits of String[19]
 Offset = StToNum(OffsetBits) // 0 <= OffSet <= 15
 Let P = String[OffSet]...String[OffSet+3]
 Return the Last 31 bits of P

為什麼這比簡單地總是取散列的前四個字節更“安全”?

在我看來,最初的意圖是確保雜湊摘要的所有位都有平等的機會為截斷部分做出貢獻。但安全散列函式的屬性之一是確保單個位的更改會導致級聯,從而在整個摘要中產生更改的位。如果您不信任散列算法中的此屬性,則您的散列算法非常弱,或者對使散列算法強大的屬性理解不足。

如果散列的任何輸入位最初不同,最後四個字節中的至少一些位將反映它,預期的碰撞阻力減少 $ 2^{80} $ 到 $ 2^{16} $ .

所以,給定一個好的散列算法,它並不是“更安全”。充其量,它同樣安全。在現實世界中,它的風險稍大一些(因此安全性較低),因為增加的複雜性為程序員提供了犯實施錯誤的機會。

引用自:https://crypto.stackexchange.com/questions/5249