Keys

什麼時候使用 PRNG,什麼時候使用 CSPRNG

  • November 15, 2021

我知道 PRNG 是使用基於種子的確定性算法的隨機數生成器。

我也知道 CSRNG 是 PRNG,可以安全地用於生成隨機數。

通過加密安全,我相信這意味著即使攻擊者知道確定性算法和種子,他們也無法預測下一個隨機數。我知道這是因為 CSRNG 也利用了一些內部狀態。

如果上述內容有任何錯誤,我將不勝感激,因為我的問題取決於它們是否準確。

所以我的主要問題是,你什麼時候需要 PRNG?什麼時候必須使用 CSPRNG?

我最初的回答是生成密鑰時應該使用 CSPRNG,但是當我搜尋“prng 用於什麼”時,我發現其中一個頁面是這樣的:

在密碼學中,PRNG 用於構造會話密鑰和流密碼

這讓我有點困惑,為什麼要用於密鑰的 PRNG,不是加密強的?我希望 CSPRNG 被使用。

這讓我意識到,也許我還沒有完全理解 PRNG 和 CSPRNG 以及它們是如何使用的。因此這個問題:在密碼學中,何時使用 PRNG,何時使用 CSPRNG?

首先,一些定義:

  • PRNG 是一個偽隨機數生成器。它可能是一個非常差的,或者俱有非常強大的數學特性的一個。這個定義無關緊要。
  • CSPRNG 是一種加密安全的 PRNG。這是一個 PRNG,有一些嚴格的要求。

在您的連結中,作者正在撰寫有關 CSPRNG 的文章,但稱它們為 PRNG。此要求暗示了“加密安全”元素:

生成的位串在對手看來應該是“隨機的”。

實際上,當 PRNG 的輸出必須與完全一致的隨機性無法區分時(這意味著輸出是不可預測的),CSPRNG 是必需的。這是一些密碼算法所要求的。

作業系統提供的大多數 CSPRNG 都會根據隨機輸入更新其內部狀態,因此即使種子或內部狀態在某個時刻洩漏,它也會自動將自身糾正為安全狀態。但這不是 CSPRNG 的要求。密碼庫提供的一些 CSPRNG 不會自動更新它們的狀態,而另一些會自動更新它們的狀態。

當不需要生成相同的輸出兩次時,始終可以使用 CSPRNG 代替 PRNG。例如,在從種子生成影片遊戲關卡時,或者在進行模糊測試時,能夠重現輸出非常重要。在這種情況下,應該使用 PRNG,或者 CSPRNG,它不會從其初始種子之外的其他來源自動更新其內部狀態。也可以使用流密碼,但根據要求,簡單的 PRNG 可能綽綽有餘效率更高

要直接回答您的問題:當密碼算法指定時,您必須使用 CSPRNG(通常是這種情況)。並且您必須使用在需要複製其輸出時不會自動更新其內部狀態的 PRNG 或 CSPRNG。對於其他情況,大多數情況下您使用哪種 RNG 並不重要。

此外,如果您以某種方式需要與完全一致的隨機性無法區分的可重現輸出,那麼您需要流密碼,而不是 PRNG。

其實很簡單。

。隨機數生成器產生隨機數(見下文)。有時,所期望的只是這些數字在計算上與隨機查找 (PRNG) 無法區分。如果您可以通過算法預測下一個數字,那沒關係。例如,蒙地卡羅實驗。Mersenne Twister非常好,可能是世界上使用最多的 PRNG(它在 Python 中),但在觀察到大約 624 個輸出後完全可以預測。因此對於隱藏秘密毫無用處

C. _ CSPRNG 是升級後的 PRNG,因為您無法預測下一個數字。它被稱為下一位測試,即無論您進行什麼觀察(不知道隱藏的內部狀態),您都無法預測下一個輸出位。所以:-

$$ P(x_{i} = 1) = \frac{1}{2} + \epsilon $$

來自偶數的偏差是(通常) $ < 2^{-64} $ . 如果您隨後對密文的第一部分做出假設,那麼它對下一部分無濟於事,並且您最終無處可去。這就是我們要隱藏的秘密。一個例子是Salsa20作為流密碼的一部分。

在密碼學中,PRNG 用於構造會話密鑰和流密碼

只是草率的說說。除非需要更窄的定義,否則我將它們都稱為 RNG。


  1. 細微差別:PRNG 可以生成具有對科學和其他東西有用的各種古怪分佈的數字。在密碼學中,我們生成均勻分佈以掩蓋我們的消息。
  2. 看看https://en.m.wikipedia.org/wiki/List_of_random_number_generators
  3. 還要注意TRNGs的存在,它是上述和硬體的混合體。

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