如果輸入是隨機的,為什麼散列函式會產生好的隨機數?
我聽說過使用雜湊方法根據兩個獨立的熵源 A、B 創建隨機數:
$ h_{i} = H(a_i+b_i) $
$ H $ 例如可以是 SHA-1 或 SHA-256。
我的問題是:
我讀到將 s 位的輸入散列到 n 位的輸出會由於截斷而減少熵。接受的答案
對我來說聽起來完全合理。但就隨機性的質量而言,這意味著什麼?當一個 1024 位的輸入被散列到 256 位時,熵當然會失去。但是我不能說“剩餘的”256 位仍然是很好的隨機數並且不會因長度截斷而受到影響嗎?不只是降低了可用隨機位的速率,而不是隨機性的質量嗎?
為什麼是雜湊函式 $ y=f(x) $ 像 SHA-1 一樣是隨機預言機嗎?到目前為止,我知道,這意味著參數集 x 映射到一組結果 y,平均分佈在 $ 2^{256} $ SHA-256 的情況下的值。為什麼會這樣?是否有嚴格的證據證明,還是只是一個可行的假設?這對我的理解意味著:
- 一個 s 位值 $ x_1 $ 以 n 位輸入雜湊結果 $ y_1 $ ,
- 一個 s 位值 $ x_2 $ 以 n 位輸入雜湊結果 $ y_2 $ ,
- 什麼時候 $ x_2 $ 不同於 $ x_1 $ 在只有一個位的位置,所有位 $ y_1 $ 與位完全“不相關” $ y_2 $ ,無論更改的位位置如何。
那正確嗎?
雖然我覺得這當然應該是一個好的雜湊的情況,但我想知道這個目標只是大致實現還是真的準確?(即使是“不相關”這個詞對我來說也很難理解,因為事實上,雜湊算法存在某種相關性)
1)是的,結果是熵率降低到 2^block_size 每次通過,無論輸入如何,只要雜湊的輸入熵足夠大。什麼構成足夠大在這個論壇上是有爭議的。您的連結問題表明所有輸入熵都被提取(當然會被截斷)。其他文獻/問題表明減半*
至於質量,談論熵而不是隨機數(這對很多人來說意味著很多事情)更正確。熵是熵是不確定性。至於上面未截斷的部分,您的 256 位,它們包含 100% 熵或 H = 1 位/位。其他 768 位可能的熵被丟棄。保存的很好。它不能比隨機更隨機**。因此,您可以增加雜湊塊大小或減少輸入長度以避免熵浪費。
2)實際達到了輸出比特不相關的目的。如果不是這樣,許多加密隨機數生成器(例如 /dev/random 和 java.security.securerandom)將有偏差且不可行。這歸結為可以測量的稱為雪崩效應的特性。通過一些隨機輸入和擺弄,您可以得出一個分佈,例如:-
您可以看到,如果您更改任何特定的輸入位,則 50% 的輸出位會發生變化。
筆記。
*我希望我們能在 crypto.SE 上解決這個未解決的問題,因為它使得在數學上回答這類問題變得困難。
*一個小小的警告。雖然你不能在數學上比隨機更隨機,但你可以有一個安全係數。如果您要從熵源中提取隨機性並且剛好處於極限(Hout = Hin),則熵輸出可能會降至 100% 以下。這將取決於您的設備、精度、溫度穩定性等。如果您包含 10 的安全係數,因此 Hin = 10Hout,您可以通過瞇著眼睛表面上說隨機性好 10 倍。