什麼時候使用 PRNG,什麼時候使用 CSPRNG
我知道 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。
- 細微差別:PRNG 可以生成具有對科學和其他東西有用的各種古怪分佈的數字。在密碼學中,我們生成均勻分佈以掩蓋我們的消息。
- 看看https://en.m.wikipedia.org/wiki/List_of_random_number_generators。
- 還要注意TRNGs的存在,它是上述和硬體的混合體。