random - 单独使用 PRNG 生成的数字的每个字节是否可以接受?

标签 random

假设您有一个非加密安全 PRNG生成 64 位输出。

假设字节为 8 位,将 64 位输出的每个字节用作单独的 8 位随机数是否可以接受,或者这可能会破坏良好 PRNG 的随机性保证吗?还是取决于 PRNG?

由于 PRNG 不是密码安全的,所以我担心的“随机性保证”不是安全性,而是字节流是否具有相同的随机性保证,使用与 PRNG 作者使用的相同的“随机性”定义,即PRNG 与其 64 位输出有关。

最佳答案

使用 CSPRNG 应该非常安全。为了进行比较,这就像逐字节读取 /dev/random 。有了好的 CSPRNG,简单地生成 8 次 64 位样本并为每个样本选择 8 位(丢弃其他 56 位)也是完全可以接受的。

对于不是 CSPRNG 的 PRNG,您将在 PRNG 的原始输出方面遇到“安全”问题,这比是否将输出切分成字节大小的 block 更重要。

在所有情况下,确保 PRNG 正确播种并定期重新播种(以便定期刷新任何可能受损的内部状态)至关重要。安全性取决于内部状态的不可预测性,而这最终是由种子输入的质量驱动的。良好的 CSPRNG 实现将为您做的一件事是悲观地估计捕获的“熵”量,以保护输出免受可预测的内部状态的影响。

但请注意,对于 8 位,在任何情况下都只有 256 个可能的输出,因此问题更多的是如何使用。例如,如果您对 PRNG 的输出执行类似基于 XOR 的加密(即,将其视为基于某些预共享 secret 种子的一次性密码簿),那么使用已知的纯文本攻击可能相对容易地泄露 PRNG 的内容。 PRNG 的内部状态。这是另一种类型的攻击,良好的 CSPRNG 实现应该通过其设计来防范(例如使用计算安全的哈希函数)。

编辑添加:如果您不关心“安全性”,而只需要输出看起来随机,那么这应该是相当安全的——理论上,一个好的 PRNG 产生 0 的可能性与产生 1 的可能性一样,并且在任何八位位组之间不应有所不同。因此,您期望可能的输出值呈线性分布。要验证这是否会扭曲分布,您可以做的一件事是运行一些相当大的尺寸(例如 1M)的蒙特卡洛模拟,并将原始 64 位和 8 * 8 位输出的直方图与 256 个 bin 进行比较。如果线性分布完好无损,您预计这两种情况都会得到大致平坦的图表。

关于random - 单独使用 PRNG 生成的数字的每个字节是否可以接受?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58171686/

相关文章:

python - 种子 python 在 Mac 和 Windows 上随机生成不同的数字

java - 如何在每次运行我的应用程序时生成一个唯一的随机数?

Java随机数重复问题

java - 从有界 nextInt(int bound) 结果中查找 Java.util.Random 种子

delphi - 随机化多个字符串列表

c - srand() — 为什么只调用一次?

python - 如何在不重复的情况下从笛卡尔积中采样

php - 生成唯一的 6 位代码

javascript - 为变量分配一个随机值

c - 在 C 中使用 rand() 生成多个随机数时出现段错误