Sha-256

SHA-256(SHA-256(x)) 會產生衝突嗎?

  • September 22, 2019

正在審查一些比特幣公鑰雜湊文獻以及 RIPEMD-160 和 SHA-256 的使用,如下所示:

RIPEMD160(SHA256(ECDSA_publicKey))

另一方面,工作量證明兩次使用 SHA256(而不是 RIPEMD-160)。

有一些關於為什麼選擇 RIPEMD160 的說明(這裡)。

考慮到 SHA256 的 256 位輸出空間,如果在 SHA256 輸出上使用 SHA256,會發生什麼(理論上)?例如:

SHA256(SHA256(x))

這會是雙射映射嗎?還是射影映射?

可以使用這種映射以任何方式破壞 SHA-256 嗎?

由於SHA-256應該是一對一的函式,因此SHA256(SHA256(x))不可能是單射函式(因為輸入空間和輸出空間都是 256 位)。但是,如果它不是單射的,那麼SHA-256對於更長的消息(> 256 位輸入)就不能是一對一的函式。這個矛盾是如何在算法中解決的?

首先,請注意,SHA-256 至少對 512 位消息進行操作。消息總是被填充為 512 位的倍數(參見下面的填充)。對於雙 SHA256(SHA256(m)),在第一次散列後,將結果填充到 512 位。

padding: SHA-256 消息格式|L|1|0..0|message size in 64 bits|。L 是要散列的原始消息位,其後跟1, 和除最後 64 位外的許多零,因此填充的消息至少是 512 位的倍數。最後 64 位是消息大小。一個 512 位散列塊可以容納的最大消息是 447 位。

因此,如果 $ x = \operatorname{SHA256}(m) $ 它將被填充為

| x 256-bit| 1 | 0000's 191-bit | 64-bit size of x) |

用於下一個 SHA-256 計算。

現在,輸入輸出空間正好是 256 位。在這種情況下,我們不知道它是否是一對一的。計算空間很大。如果它是一對一的,那麼它也將是一個排列。有 $ 2^{256}! $ 排列和有 $ (2^{256})^{(2^{256})} $ 功能。如果它是一個排列,那將是驚人的。為簡單起見,以5位為例,有32個!排列〜112位,有 $ 32^{32} $ 功能〜161位。如果我們認為受限的 SHA-256 是一個隨機選擇的函式,那麼被置換的機率大約是 $ \frac{1}{2^{50}} $ . 查看WolframAlpha對數刻度的一瞥。

由於 SHA-256 應該是一對一的函式

SHA-256 不是一對一的函式。它是一種單向功能,即您無法恢復它。由於最小輸入大小為 512 位,輸出大小始終為 256 位,因此無法一對一。

這會是雙射映射嗎?還是射影映射?

這將是滿射映射。

但如果它不是單射的,那麼 SHA-256 就不能成為更長消息(>256 位輸入)的一對一函式。

這不是一對一的。

SHA-256(SHA-256(x)) 會產生衝突嗎?

如果我們認為你在談論散列比特幣公鑰,它有 33 字節壓縮和 65 字節未壓縮公鑰。

如果密鑰是未壓縮的,它有 520 位因此根據鴿巢原理會有衝突。

如果密鑰被壓縮,它又是 264 位的,因此根據鴿巢原理會有衝突,輸出是 256 位。

請注意,SHA-256(SHA-256(x)) 仍然是抗碰撞的

可以使用這種映射以任何方式破壞 SHA-256 嗎?

在 SHA-256d 中看到這個問題“弱點” ?對於 FGrieu 的好回答。

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