可以通過散列輸出將 PRNG 製成 CSPRNG 嗎?
所以我正在考慮我最後一個問題的答案,這讓我思考:
如果我理解正確, CSPRNG 的必需屬性之一是它可以防止從它產生的輸出中洩露有關其內部狀態的資訊。
假設我們有一個滿足 CSPRNG 的所有其他屬性的 PRNG(我還不相信自己知道所有這些屬性是什麼),但被懷疑在輸出中洩漏了太多的狀態。
我的直覺是,我們可以通過一個已知適用於密碼學的散列算法執行其輸出,從而使其成為 CSPRNG。
一個例子:假設 PRNG 有 128 位狀態,並產生 128 位數字作為其輸出。如果我要執行 8 次,我將有 1024 位。假設我然後將其輸入 SHA-512/256 或類似方法,並將摘要的兩個 128 位片段作為新輸出返回。
所以在這個例子中,每執行八次底層 PRNG,我就會得到兩個新組合 PRNG 的輸出。這可能比適當的 CSPRNG 效率低,並且可能已經洗掉了 PRNG 可能具有的任何其他屬性。但它現在是 CSPRNG 嗎?
我懷疑答案是“否”或“僅當原始 PRNG
$$ … $$” 或者充其量是“一般要點是正確的方向,但你的具體例子不是因為$$ … $$",或它們的某種組合。 我也知道,在沒有正確理解的情況下,天真地嘗試像這樣組合原語實際上會導致其他問題。
我突然想到,一些操作,比如 XOR 和密碼學中使用的散列函式,可以“破壞”資訊,因為多個可能的輸入可以產生相同的輸出,同時仍然保留正確的“隨機性”屬性。
天真地似乎我們需要減少 PRNG 的輸出顯示其狀態的程度,我正在尋找一些檢查是否正確或錯誤的方式。
似乎“我可以通過在其所有輸出上執行安全散列將 PRNG 轉換為 CSPRNG 嗎?” 是一個很好的問題,至少可以探索其中的一些。
不,問題的構造不能保證將 PRNG 變成 CSPRNG。在某些情況下,散列會使生成器惡化。此外,在散列後仍可檢測到不良特徵。有更好的方法可以從雜湊建構 CSPRNG。
問題的構造,即未來加密安全偽 RNG 的 WBCSPRNG,是一個與原始 PRNG 具有相同輸入特徵和狀態大小(在幾位內取決於如何計算)的 PRNG。在雜湊表現為隨機預言的假設下,它的周期明顯不小於 PRNG 一個很大的因子(更糟糕的是 1024/256=4)。除非我們添加一些關於 PRNG 的假設,否則我沒有看到任何其他令人欣慰的內容。
特別是,我們可以設計一個具有大狀態和長周期的 PRNG,當原始 PRNG 始終通過它們時,WBCSPRNG 無法通過大多數現有 PRNG 測試套件。從一個好的 CSPRNG 開始,並對其進行修改,以便在輸出 1023 位後,通過對這些和一個零位進行散列來產生下一位,將 256 位相加得到 $ b\in[0,256] $ ,如果輸出為零 $ b<128 $ , 一個如果 $ b>128 $ ,否則是雜湊的低位。
我們建構的 PRNG 不再是 CSPRNG,但仍然通過了任何預先存在的 RNG 測試(沒有預先存在的 RNG 測試會捕捉到額外位是如何生成的)。然而 WBCSPRNG 偏向於零,大多數 RNG 測試套件都會檢測到這一點。
上面的反例是惡意構造的,並且需要知道雜湊,我們可以禁止。這還不夠好:一整類意外缺陷被放大了。例如,如果 PRNG 具有每個 2個 42位輸出塊的第一個 1024 位塊相同的不良特性,則 WBCSPRNG 具有每個 2個 40位輸出塊的第一個 256 位塊相同的特性,這可能會很快引起問題。
在學術上評估 CSPRNG 的安全性時的假設是它的設計是公開的,這裡包括 WCSPRNG 的散列步驟和 PRNG。如果 PRNG 具有可能出現在其輸出中的一類 1024 位塊的特性,那麼在測試少 4 倍的位後,在 WCSPRNG 輸出中也可以檢測到這一點。
該方法作為構造 CSPRNG 的方法沒有實際意義,因為我們不需要 PRNG 來從諸如 SHA-512/256 之類的散列中生成 CSPRNG,而且比問題的方法更有效:我們散列種子輸入,設置一個計數器,然後產生 256 位的輸出,我們散列狀態然後遞增它。