Random-Number-Generator

為什麼選擇 LCG PRNG 作為 c++ rand() 函式?

  • March 2, 2020

C++ rand() 函式是一個線性同餘生成器 (LCG) PRNG。我的問題是:

  1. 為什麼選擇這個算法?
  2. 優缺點都有什麼?
  3. 它對密碼學有好處嗎?

C++rand()函式(實際上是 C 函式)不是(旨在 | 設計 | 標準化)用於加密目的。

  1. 為什麼選擇這個算法?

正如 SEJPM 在評論中指出的那樣,rand 函式來自 C,而 C++ 對實現沒有上限。

  1. 優缺點都有什麼?
  2. 它對密碼學有好處嗎?

長話短說;不要將其用於密碼學。出於加密目的使用/dev/urandom

好的; 它又快又小。壞的; 它是確定性的,而且種子很小(正如 poncho 在評論中指出的那樣),這阻止了它從 LCG 生成加密安全的 RNG。

/dev/urandom 是生成密碼學種子的最佳方法,但有時我們需要一個安全的確定性 PRNG,以便使用相同的 /dev/urandom 在兩側計算其序列;我說的是 CSPRNG(加密安全偽隨機數生成器)。我的建議是查看 Salsa20 的實現(例如 Chacha20)。這些是密碼學安全的算法,可能是你能找到的最好的。用於加密目的的另一種選擇如下:Blum-Micali、ISAAC、Yarrow 和 Fortuna。也許我們想討論一下 CSPRNG 中哪個更快。

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