让我们通过假设您实际上是指“/dev/urandom”来澄清“linux PRNG”的含义,如this answer中所建议的那样。
现在,它背后的算法是众所周知的 - 让我们在源评论中阅读它:
当需要随机字节时,它们是通过获取“熵池”内容的 SHA 哈希来获得的。SHA 哈希避免暴露熵池的内部状态。人们认为从 SHA 的输出中推导出有关 SHA 输入的任何有用信息在计算上是不可行的。即使有可能以某种巧妙的方式分析 SHA,只要从生成器返回的数据量小于池中的固有熵,输出数据是完全不可预测的。出于这个原因,例程在输出随机数时降低了其对熵池中包含多少“真实随机性”的内部估计。
如果这个估计变为零,例程仍然可以生成随机数;然而,攻击者可能(至少在理论上)能够从先前的输出推断生成器的未来输出。这需要对 SHA 进行成功的密码分析,这被认为是不可行的,但可能性很小。尽管如此,这些数字应该对绝大多数目的有用。
所以有一个从不同来源获得的随机池,并定期更新;典型的大小似乎是 4096 位。把“攻击者”换成“机器学习”,你就有答案了:
没有已知的方法来反转 SHA-1,或将 SHA-1 输出与非 SHA-1 输出区分开来。标准分类和聚类肯定会在这项任务中失败,找到成功的算法会非常令人惊讶,因为它会对 SHA-1 本身提出可行的攻击。并不是说 SHA-1 是完美的(它已经被弃用了,因为已经描述了碰撞攻击,而且它们只会变得更好)——但它已经很好地经受住了时间。