伪随机数发生器怎么可能不重复?

时间:2016-08-08 21:04:39

标签: algorithm random

我的理解是PRNG的工作是使用输入种子和将其转换为非常不相关的输出的算法,以便下一个生成的数字尽可能不可预测。但这是我看到的问题:

我能想象的任何伪随机数生成器必须具有有限数量的结果。假设我使用的是随机数生成器,可以生成0到1000亿之间的任意数字。如果我要求输出一千亿次和一次,我可以肯定一个数字输出了不止一次。如果相同的种子在通过算法时总是给出相同的输出,那么我可以确定PRNG将开始循环。我的逻辑在哪里有缺陷?

如果我是正确的,如果您知道PRNG的算法,并且PRNG正用于加密,则不能使用这种方法(并且是否有任何措施来防止它?):< / p>

  • 使用PRNG生成可能的整个循环数字。
  • 了解生成私钥的时间戳,以及稍后知道PRNG的时间和输出
  • 根据计算所需的时间,确定已知输出与未知输出之间的数量
  • 在预生成列表中查找以查找生成的数字

4 个答案:

答案 0 :(得分:5)

理论上 这个方法可以用来打破PRNG,这是绝对正确的,因为正如你所说,给定足够长的输出序列,你可以开始预测接下来会发生什么。

问题是&#34;足够长&#34;可能是这么长,以至于这种做法完全不切实际。例如,Mersenne twister PRNG,它不是为加密使用而设计的,其周期为2 19,937 - 1,这太长了以至于它完全不可行尝试你正在描述的攻击。<​​/ p>

一般来说,假设伪随机生成器使用n位内部存储器。这给出了这些位的2个 n 可能的内部配置,这意味着在您确保看到重复之前,您可能需要看到2 n + 1个输出。鉴于大多数加密安全的PRNG使用至少256位内部存储,这使得您的攻击不可行。

值得注意的一个细节是,&#34; PRNG重复一个数字&#34;从那时起,数字将永远是相同的。&#34; PRNG可能会多次重复输出,然后再继续输出不同的数字,前提是内部状态每次都不同。

答案 1 :(得分:4)

你是对的,PRNG产生一长串数字,然后重复。对于普通用途,这通常就足够了。正如您所指出的,不是用于加密用途。

对于理想的加密数字,我们需要使用真正的RNG(TRNG),它从某些熵源生成随机数(=此上下文中的随机性)。这种源可以是卡上的一小块放射性材料,断开的麦克风电路中的热噪声或其他可能性。许多不同来源的混合物将更能抵抗攻击。

通常这种熵源不会产生足够的随机数来直接使用。这就是PRNG用于“拉伸”真实熵以从TRNG提供的较小量的熵产生更多伪随机数的地方。熵用于为PRNG播种,并且PRNG基于该种子产生更多的数字。允许的拉伸量是有限的,因此攻击者永远不会获得足够长的伪随机数字串来进行任何有价值的分析。达到限制后,必须从TRNG重新接种PRNG。

此外,无论多么小,每次数据请求后都应该重新接种PRNG。有各种加密原语可以帮助解决这个问题,例如哈希。例如,在每次数据请求之后,可以生成另外128位数据,与任何可用的累积熵进行异或,散列并使用生成的散列输出来重新生成发生器。

加密RNG比普通PRNG慢,因为它们使用慢速加密原语,并且因为它们采取了额外的预防措施来抵御攻击。

有关CSPRNG的示例,请参阅Fortuona

答案 2 :(得分:2)

可以在PC上创建真正的随机数生成器,因为它们是不确定的机器。

实际上,由于分层内存级别的复杂性,CPU流水线的复杂性,无数进程和在任意时刻激活的线程共存以及竞争资源的共存,以及I / O设备的异步性,没有所执行操作数与经过时间之间的可预测关系。

因此,不时地查看系统时间是一个完美的源随机性。

答案 3 :(得分:1)

  

我能想象的任何伪随机数生成器必须具有有限数量的结果。

我不明白为什么这是真的。为什么它不能逐渐增加状态,在内存不足时失败?

这是一个从不重复的简单的PRNG算法:
1)以攻击者不知道的任何数据量作为种子的种子 2)计算数据的SHA512哈希值 3)输出该哈希的前256位 4)将该哈希的最后一个字节附加到数据中 5)转到第2步。

而且,出于实际目的,这并不重要。只有128位状态,您可以生成一个不会重复输出的PRNG,以获得340282366920938463463374607431768211456输出。如果你在10亿年内每秒输出10亿输出,你将无法通过其中的十亿分之一。