【问题标题】:What should be used as a PRNG seed?什么应该用作 PRNG 种子?
【发布时间】:2021-11-10 22:01:50
【问题描述】:

大多数论文要么甚至没有提及它,要么只是说从某个地方获取“初始向量”。

贴在很多地方的方法是使用系统时间。然而,这不是一个严重的漏洞(假设算法是已知的)吗?如果在几秒钟内知道时间,我估计(通过使用QueryPerformanceCounter 进行一些琐碎的测试)实际信息将少于 24 位(非常可悲)。此外,由于时间具有某种可预测性,因此可以提前为假设的攻击生成必要的信息。

有没有办法初始化 PRNG 而不会感到难过?

【问题讨论】:

  • 您想到什么应用程序?是用于游戏、模拟还是信息安全应用程序?对于后者,一个相关问题:stackoverflow.com/questions/62375129 对于前两个,一个相关问题:stackoverflow.com/questions/59263562/… 此外,NumPy 使用操作系统的随机器初始化其生成器,而不仅仅是时间戳,默认情况下:stackoverflow.com/questions/66092967
  • 我没有做任何特别的事情。只是好奇。对于像游戏或模拟这样的没有对手的情况,时间会很好。您发布的链接(用于加密案例)很有趣。然而,它基本上说的是“更加努力”:D
  • 或许(time(0)*0x10000) ^ getpid() 之类的?
  • pid 是公开信息。我假设算法是已知的。所以这些修改不会增加信息内容。
  • 如果您正在寻找加密安全种子,代码需要像 urandom 这样的东西 - 一个真正的随机源。如果要引起 2 个同时程序调用的不同行为,^ getpid() 很有用。并非所有使用 random() 函数的程序都需要加密安全 PRNG 种子。 “什么应该用作 PRNG 种子?”是程序要求的具体问题,而不是一般问题。

标签: algorithm random cryptography random-seed


【解决方案1】:

如果您需要生成加密安全的随机数,您应该几乎总是使用操作系统的 CSPRNG;即/dev/urandomCryptGenRandomgetrandomgetentropy等。这将是安全的、精心设计的、经过充分测试的,并且通常是万无一失的。

万一您实际上需要不同的 CSPRNG,那么 PRNG 熵应该从系统 CSPRNG 或从系统一播种的另一个 CSPRNG 中提取。例如,如果您确实需要非常快速地生成随机数并且 OS 生成器不够快,您可以使用从 OS 生成器播种的每线程 CSPRNG。

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

如果您不需要加密安全,您可以从任何您喜欢的来源获取种子,但是如果您不太在意而只是想要一个好的种子,那么 OS CSPRNG 是一个不错的选择。对于非加密目的,我喜欢 ChaCha8(它是一种加密算法,但 8 轮不够保守)作为我的 PRNG,因为它通常比大多数替代方案更快,具有良好的统计特性,并且可以很容易地用任何 32-或 64 位值,只需将该值作为键重复即可。在这种情况下,只要种子不太可能重复,它可能会产生良好的输出。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 1970-01-01
    • 2018-12-05
    相关资源
    最近更新 更多