Random-Number-Generator

CSPRNG 的種子是否應該產生相同的隨機數?

  • December 18, 2019

假設我們正在設計一個用於加密的 CSPRNG,就像用於基於 ECC 的加密一樣。

是否要求種子始終產生相同的隨機數?還是應該將其設計為產生不同的數字,使其更加安全?

種子是任何 CSPRNG 的熵源。CSPRNG 是一個隨機數生成器。名稱中的“偽”部分明確表示它僅依賴於使用一個或多個種子從算法外部傳遞的熵。因此,根據定義,CSPRNG不能設計為產生“不同的數字”,因為結果完全取決於算法的播種。

也許術語“確定性隨機位生成器”或 DRBG 更好地理解了這個含義——大多數 CSPRNG 實現也主要輸出偽隨機位而不是偽隨機(範圍)數。


現在許多執行時中的 CSPRNG實現依賴於作業系統的播種。如果使用者自己提供種子,這種播種甚至可能發生。基本上,此類系統將種子視為額外的熵源,通過將它們混合到狀態中,使下一個檢索到的值取決於這兩個熵源。

此外,CSPRNG 算法或算法實現可以被配置(顯式或隱式)以在一定數量的位或呼叫之後執行*重新播種。*在這種情況下,CSPRNG 對提供(初始)種子的系統執行回調,以檢索其他種子,然後將這些種子混合到狀態中。使用者通常還可以呼叫方法來添加種子或發出重新播種的請求。

如果呼叫之間的位數不同,通常不明確要求 CSPRNG 返回相同的隨機位。即使 CSPRNG 處於相同狀態,請求 8 位然後 16 位可能導致與請求 16 位然後 8 位不同的值。

CSPRNG 也可能會稍微改變它們的實現,例如它們可能會使用幾種不同的方法生成一個範圍內的數字。

如果您希望讓執行時系統的 CSPRNG 為相同的種子生成相同的序列,那麼所有這些都使得使用執行時系統的 CSPRNG 非常危險,並且為此目的使用 CSPRNG 在任何設計中都是一個巨大的危險信號——除非 CSPRNG 是明確設計用於這樣的目的。


如果您確實需要可預測的流,那麼最好使用 KDF(用於相對較小的輸出)、XOF(如 SHAKE-128 或 SHAKE-256)或流密碼。請注意,儘管諸如 EC 之類的加密系統也可能以不同的方式使用這些位,因此如果這些系統更改實施,您仍然會得到不同的結果。

然而,一般來說,實現需要隨機性的密碼系統只需要一個種子良好的 CSPRNG。

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