我什么时候应该使用 AutoSeededRandomPool(而不是 NonblockingRng)?

When should I use AutoSeededRandomPool (and not NonblockingRng)?

我发现Crypto++提供了几个随机生成器:AutoSeededRandomPoolAutoSeededX917RNG等等。我知道一些关于这些生成器的细节和它们的用法,我只是想知道我什么时候需要它们?

AutoSeededRandomPoolAutoSeededX917RNG默认基于NonblockingRngNonblockingRng基于/dev/urandom/dev/urandom基于/dev/randomChaCha

我搜索了一下,发现很多文章都说 /dev/urandom 足够安全并且适用于所有(几乎?)场景,那么为什么要使用 DES/AES 来加密从 /dev/urandom 读取的数据并且比直接使用“/dev/urandom”慢得多?

什么时候应该使用 AutoSeededRandomPoolAutoSeededX917RNG

When should I use AutoSeededRandomPool or AutoSeededX917RNG?

你应该使用 AutoSeededRandomPool。它使用基于 AES 的 PGP 样式生成器从 OS 池中提取熵。它还将时间与种子混合,以帮助加强抵御 VM 回滚攻击。

您还应该为每个线程创建一个 AutoSeededRandomPool。如果您为所有线程使用单个生成器,那么您需要提供锁。

AutoSeededX917RNG 是从 NIST 批准基于 AES 的 ANSI X9.31 生成器用于 FIPS 140 验证密码学的时候开始的。 X9.17 和 X9.31 生成器还用于其他一些标准,例如汽车和金融。

NIST 在 2014 年左右弃用了 AutoSeededX917RNG 生成器,转而使用 SP800-90 中指定的确定性位生成器。

如果您愿意,可以使用AutoSeededX917RNG。但是除非你有要求,否则你应该只使用 AutoSeededRandomPool.