Encryption

散列或加密兩次以提高安全性?

  • March 31, 2017

比特幣論壇上,我問為什麼比特幣客戶端出於各種目的計算 SHA-256(SHA-256(x)) 作為其加密雜湊。領先的理論——因為比特幣作者已經消失了——似乎是從安全的角度來看,它可能有點類似於將 SHA-256 的輪數從 64 增加到 128,從而提供安全邊際第一次針對 SHA-256 的原像攻擊(如果存在這種情況)很可能不會針對 SHA-256(SHA-256(x)),從而有時間過渡到新的雜湊函式。

首先,這是真的嗎?至少對於某些類型的攻擊,兩次雜湊是否會使發起原像攻擊變得更加困難?

如果答案是肯定的,我的相關問題是:是否有一種加密兩次的模式以提供類似的安全性提高?如何將第一輪加密的結果輸入到第二輪(或第三輪)的設置中?你會用同一個鑰匙兩次嗎?您會從第一輪的密文(以及第二輪的第三輪等)的密文(雜湊)中導出第二個密鑰嗎?您是否需要像 Triple-DES 那樣的奇數輪和交替 Encrypt(Decrypt(Encrypt())) 來防止中間相遇攻擊?這將如何與各種對稱密鑰加密模式互動?如果我要在真正的產品中實現它,我還沒有想到我必須知道的其他任何事情?

SHA-256(SHA-256(x)) 是由 Ferguson 和 Schneier 在他們的優秀著作《實用密碼學》(後來由 Ferguson、Schneier 和 Kohno 更新並更名為《密碼學工程》)中提出的,作為一種製作 SHA-256 的方法對“長度擴展”攻擊無懈可擊。他們稱之為“SHA-256d”。當我們在 2006 年啟動 Tahoe-LAFS 項目時,我們開始在所有事情上使用 SHA-256d,其原則是它的效率幾乎不低於 SHA-256,而且它讓我們不必考慮長度擴展攻擊是否危險我們使用雜湊函式的每個地方。如果比特幣的發明者出於類似原因使用它,我不會感到驚訝。為什麼使用 SHA-256d 而不是 SHA-256?

請注意,SHA-3 項目要求所有候選人都有一些防止長度擴展攻擊的方法。其中一些使用類似於 SHA-256d 的方法,即在發出結果之前,它們在最後對其狀態進行額外的“最終化”散列。

對於第二次原像攻擊:

hash(x) = hash(y)暗示hash(hash(x)) = hash(hash(y))

所以它不能防止直接的原像攻擊。比特幣為此建構了一個Merkle 樹a b chash(hash(hash(a)+hash(b))+hash(hash(c)+hash(c))).

您可以再次看到,如果有人發現 ac'與 具有相同的 SHA-256 雜湊c,他們可以替換它,最終結果仍然相同。

雖然這確實可以提高對第一次原像攻擊的抵抗力,但沒有任何明顯的情況表明這些很重要——攻擊者通常會擁有生成雜湊的明文。(考慮到 ECDSA 操作在那裡,對地址的原像攻擊似乎有些牽強。)

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