2

这里的随机性是指伪随机性,就像 Linux 的随机数生成器一样。例如,我有 100-1000 个数组,每个数组包含由 Linux 伪随机数生成器生成的 10000 个随机整数。现在给定一个新的整数序列,是否有任何机器学习算法,如分类或聚类,可以检测到这个整数序列是否像之前的训练数据一样是伪随机数序列?

出于某种原因,我实际上并不关心给定序列的真正随机性,我只想知道这个给定序列是否是由一些 sepcial linux 伪随机整数生成器生成的。假设Linux RNG确实有一个生成伪随机整数序列的归纳函数,我们是否可以根据它生成的一些现有随机序列来预测这个RNG是否生成了一个现有的整数序列?

4

2 回答 2

2

让我们通过假设您实际上是指“/dev/urandom”来澄清“linux PRNG”的含义,如this answer中所建议的那样。

现在,它背后的算法是众所周知的 - 让我们在评论中阅读它:

当需要随机字节时,它们是通过获取“熵池”内容的 SHA 哈希来获得的。SHA 哈希避免暴露熵池的内部状态。人们认为从 SHA 的输出中推导出有关 SHA 输入的任何有用信息在计算上是不可行的。即使有可能以某种巧妙的方式分析 SHA,只要从生成器返回的数据量小于池中的固有熵,输出数据是完全不可预测的。出于这个原因,例程在输出随机数时降低了其对熵池中包含多少“真实随机性”的内部估计。

如果这个估计变为零,例程仍然可以生成随机数;然而,攻击者可能(至少在理论上)能够从先前的输出推断生成器的未来输出。这需要对 SHA 进行成功的密码分析,这被认为是不可行的,但可能性很小。尽管如此,这些数字应该对绝大多数目的有用。

所以有一个从不同来源获得的随机池,并定期更新;典型的大小似乎是 4096 位。把“攻击者”换成“机器学习”,你就有答案了:

  • 如果池是空的(也就是说,请求了很长的随机字节序列而池没有被补充),那么问题就等同于识别 SHA-1 的输出。

  • 如果在抽奖之间补充池子,那么问题就更难了,因为您将有更短的运行时间来测试关于如何生成数字的任何假设。

没有已知的方法来反转 SHA-1,或将 SHA-1 输出与非 SHA-1 输出区分开来。标准分类和聚类肯定会在这项任务中失败,找到成功的算法会非常令人惊讶,因为它会对 SHA-1 本身提出可行的攻击。并不是说 SHA-1 是完美的(它已经被弃用了,因为已经描述了碰撞攻击,而且它们只会变得更好)——但它已经很好地经受住了时间。

于 2018-07-19T16:19:42.857 回答
1

这是人们提出的一个传统问题。有关经典分析,请参阅 Donald Knuth 的计算机编程艺术,第 2 卷——“半数值算法”。

如果您需要更先进的测试,可以在http://csrc.nist.gov/groups/ST/toolkit/rng/index.html找到一个软件套件,其中还包含大量文档。

您也可以考虑阅读 Wikipedia 页面:http ://en.wikipedia.org/wiki/Statistical_randomness以了解该领域的内容。

于 2013-10-29T18:36:59.707 回答