Hash

為什麼要雜湊兩次?

  • October 6, 2019

我試圖理解比特幣協議,有時會看到這樣的說明:

TransactionId 由 SHA256(SHA256(txbytes)) 定義

或者

公鑰的散列是通過對公鑰執行 SHA256 散列,然後對結果執行 RIPEMD160 散列生成的,使用 Big Endian 表示法。該函式可能如下所示:RIPEMD160(SHA256(pubkey))

雜湊計算兩次的目的是什麼?

兩次散列的常見理由是防止散列的長度擴展屬性(如果它具有該屬性,則與 SHA-3 之前的散列一樣多)。對於 SHA-256,此屬性允許計算 $ \operatorname{SHA-256}(X|Y|Z) $ 會心 $ \operatorname{SHA-256}(X) $ 和長度 $ X $ , 簡稱 $ Y $ 只有長度的函式 $ X $ , 和一些任意給定的 $ Z $ (無論未知 $ X $ 可能)。這可能是一個問題,請參閱這個問題

此外,使用 SHA-256 和 RIPEMD-160 的基本原理可能是:

  • 對兩個雜湊中的任何一個的第一原像攻擊(反轉雜湊的能力)不太可能破壞組合,可以說提高了對未來可能攻擊的彈性。
  • 因為第二個散列比第一個短,結果分佈更接近隨機(使用相同散列進行兩次散列的缺點是未達到大約三分之一的輸出值;但這無法通過計算檢測)。
  • 它可以防止適用於在某些假設的工作量證明協議中迭代兩次的相同雜湊的攻擊;參見 Yevgeniy Dodis、Thomas Ristenpart、John Steinberger、Stefano Tessaro:雜湊還是不再雜湊?(在)H 2和 HMAC的可微性結果,在Crypto 2012 的程序中,以及我的反流
  • 這使得現有的蠻力搜尋工具不太可能是合適的;新穎性的安全性僅在短時間內起作用,但可能會給那些提前了解設計決策的人一些準備時間。
  • 這是用這 4 個屬性和可辨識名稱指定 160 位散列的一種簡潔方法,不會像 SHA-1 那樣被某些抗碰撞攻擊玷污。

請注意,第二個雜湊的輸入非常短,因此速度很快;對於第一個和整體散列的大量輸入,構造的效率僅略低於單個散列。

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