Randomness
CSPRNG 和 PRNG 有什麼區別?
CSPRNG 和 PRNG 有什麼區別?
它們之間是否存在性能差異?**例如:**我們使用 PRNG 生成非常昂貴的密鑰,使用 CSPRNG 生成快速分組密碼中的 IV/nonce?
這兩種RNG有什麼區別?
“PRNG”的意思是“偽隨機數生成器”,這意味著一個數字序列(位、字節……)是從一個看似隨機的算法產生的,但實際上是確定性的(序列是從某個未知的內部狀態生成的),因此偽隨機。
這種偽隨機性可以是密碼安全的,也可以不是。如果沒有人能可靠地區分輸出與真正的隨機性,那麼它在密碼學上是安全的,即使 PRNG 算法是完全已知的(但不是它的內部狀態)。非密碼安全的 PRNG 會欺騙基本的統計測試,但可以被智能攻擊者與真正的隨機性區分開來。
例如,考慮以下生成器:
- 有一個內部狀態s,它是一個 20 字節的序列。
- 生成器按 20 字節塊生成長字節序列。
- 為了產生下一個塊,算法是:輸出s,然後將s設置為 SHA-1( s )。
這個 PRNG 在統計上會非常好,但與真正的隨機性區分開來是微不足道的:只需在輸出中取兩個連續的 20 字節塊,看看第二個是不是 SHA-1 對第一個的結果。這不是加密安全的PRNG。
當然,每個 CSPRNG 都是 PRNG,但不是每個 PRNG 都是 CSPRNG。像Mersenne twister這樣的一些非 CS PRNG可以實現相當高的性能,並且足以在沒有智能攻擊者可以擊敗的非加密情況下(例如物理模擬)。儘管也有一些已知的高性能 CSPRNG(例如這些流密碼),但非 CS PRNG 可能在缺乏密碼安全性不是問題的情況下提供優勢。