应该用什么作为PRNG种子?



大多数论文要么根本不提它,要么只是说得到一个"初始向量";

在很多地方发布的方法是使用系统时间。然而,这不是一个严重的漏洞(假设算法是已知的)?如果在几秒钟内知道时间(通过使用QueryPerformanceCounter进行一些琐碎的测试),那么实际信息将少于24位(相当可悲)。另外,由于时间在某种程度上是可预测的,人们可以提前为假想的攻击生成必要的信息。

是否有一种方法可以初始化PRNG而不感到悲伤?

如果您需要生成加密安全的随机数,您应该几乎总是使用操作系统的CSPRNG;即/dev/urandomCryptGenRandomgetrandomgetentropy等。这将是安全的,良好的种子,良好的测试,通常是万无一失的。

在不太可能的情况下,您实际上需要一个不同的CSPRNG,那么PRNG熵应该从系统CSPRNG中提取,或者从系统CSPRNG中提取另一个种子CSPRNG。例如,如果您确实需要非常快速地生成随机数,而操作系统生成器不够快,则可以使用从操作系统生成器中播种的每个线程CSPRNG。

我们假设攻击者知道您的代码是如何设计和结构的,因此,如果您使用易于猜测的值(如PID、时间或用户ID)植入CSPRNG,那么攻击者很可能能够基于看到少量输出来猜测未来的输出。

如果您不需要加密安全性,您可以从您喜欢的任何来源提取种子,但是如果您不太关心而只想要一个好的种子,那么操作系统CSPRNG是一个不错的选择。对于非加密目的,我喜欢ChaCha8(这是一种加密算法,但8轮不够保守)作为我的PRNG,因为它通常比大多数替代方案更快,具有良好的统计特性,并且可以通过重复该值作为密钥轻松地使用任何32位或64位值。在这种情况下,只要种子不重复,它就可能产生良好的产量。

最新更新