使用 /dev/urandom 实现快速、加密强度高的 PRNG

使用 /dev/urandom 实现快速、加密强度高的 PRNG

编辑让问题更具体:
程序可以/dev/urandom在云中的 Ubuntu LTS VM 上以至少 1MB/秒的速率读取提供高质量、加密强度高的随机数吗?或者是否有任何我需要采取的陷阱考虑在内?

原来的:

我需要编写一个提供随机数的组件,满足多个条件:

  1. 它必须生成统计上独立、线性分布的数字,并通过行业标准统计随机性测试。
  2. 该算法必须被视为“加密强度高”。
  3. 它必须足够快。
  4. 目标系统将是在云中虚拟化的 Ubuntu LTS。

我正在考虑使用从中读取的数字/dev/urandom而不是使用真正的(硬件)RNG(例如)或编写 CSPRNG 代码。我收集的信息(见下文)似乎表明这是一种有效的方法,但我想确保我没有遗漏任何内容。

  • 根据Linux 随机数生成器的文档和分析第 8.2 节:
    测试表明,为 /dev/random 和 dev/urandom 生成随机数的输出函数生成的数据表现出理想随机数生成器的特征。因此,没有发现会减少随机数熵的实施错误。
    这似乎满足第一个要求。

  • 根据维基百科引用的资料,Linux 内核使用恰恰20生成数据的算法/dev/urandom4.8版本。该算法通常被认为是“加密安全的”。
    这似乎满足了第二个要求。

  • 我没有可用的 Ubuntu 系统,但我{ timeout --foreground 1s cat /dev/urandom; } | wc -c在我的 M1 Mac 上运行,它报告约为 200MB/s,这对于我的要求来说已经足够快了。运行相同在线的速度快了 2.5 倍。
    一个小型 C++ 程序使用低级read()调用重复填充 40KB 缓冲区/dev/urandom,实现了约 1GB/s 的速度。我无法getrandom()在 Mac 上进行测试,但对 Gotbolt 的快速检查表明,对于相同的缓冲区大小,两种方法的性能大致相同。
    这似乎满足了第三个要求。

  • 文章表明加速改进来自内核版本 5.17(以及 5.18 中的进一步改进),这意味着它们已经在 Ubuntu 22.04.2LTS(使用版本 5.19 的内核)中。

我是否遗漏了任何注意事项?

相关内容