Random-Number-Generator
為什麼選擇 LCG PRNG 作為 c++ rand() 函式?
C++ rand() 函式是一個線性同餘生成器 (LCG) PRNG。我的問題是:
- 為什麼選擇這個算法?
- 優缺點都有什麼?
- 它對密碼學有好處嗎?
C++
rand()
函式(實際上是 C 函式)不是(旨在 | 設計 | 標準化)用於加密目的。
- 為什麼選擇這個算法?
正如 SEJPM 在評論中指出的那樣,rand 函式來自 C,而 C++ 對實現沒有上限。
- 優缺點都有什麼?
- 它對密碼學有好處嗎?
長話短說;不要將其用於密碼學。出於加密目的使用
/dev/urandom
好的; 它又快又小。壞的; 它是確定性的,而且種子很小(正如 poncho 在評論中指出的那樣),這阻止了它從 LCG 生成加密安全的 RNG。
/dev/urandom 是生成密碼學種子的最佳方法,但有時我們需要一個安全的確定性 PRNG,以便使用相同的 /dev/urandom 在兩側計算其序列;我說的是 CSPRNG(加密安全偽隨機數生成器)。我的建議是查看 Salsa20 的實現(例如 Chacha20)。這些是密碼學安全的算法,可能是你能找到的最好的。用於加密目的的另一種選擇如下:Blum-Micali、ISAAC、Yarrow 和 Fortuna。也許我們想討論一下 CSPRNG 中哪個更快。