SHA-256(SHA-256(x)) 會產生衝突嗎?
正在審查一些比特幣公鑰雜湊文獻以及 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 的好回答。