是否有一种可靠的方法来检测整数列表来自一个普通的PRNG?

时间:2014-04-25 23:34:01

标签: random prng

基本上我正在寻找侦探功能。我传给它一个整数列表(可能在20到100个整数之间)并且它告诉我"是的,84%的可能性来自PRNG,我测试它与大多数现代编程语言使用的主要版本" ,或者"不,只有12%的可能性来自着名的PRNG"。

如果它有帮助(或阻碍),整数将始终在1到999之间。

这是否存在?

3 个答案:

答案 0 :(得分:2)

除非你准备在数论中开辟新天地,否则你只能发现过时的,设计糟糕的或种子不足的PRNG。良好的PRNG明确设计用于防止您尝试做的事情。随机数生成是数字密码学的关键部分,因此需要花费大量精力来生成满足所有已知测试的随机数。

有一些测试来评估PRNG。例如,请参阅此NIST page

正如评论所指出的那样,前两个句子被夸大了,对于可能用于密码学的PRNG来说,这两个句子都是严格的。可以为其他域选择较弱(即更可预测)的PRNG,以改善时间或空间性能。

答案 1 :(得分:2)

如果你有一个625或更多的32位整数序列,你可以高度自信地检测它是否来自连续调用Mersenne Twister。那是因为它泄漏了输出值中的状态信息。

有关如何完成的示例,请参阅this blog entry

当您没有完整的32位整数等理想数据时,理论上可以获得类似的结果,但是您需要更长的序列并且数学变得更难。您还需要知道 - 或者通过尝试明显的选项来猜测 - 数字如何从较大范围减少到较小范围。

其他PRNG也可能有类似的结果,但通常只有非加密的PRNG。

原则上,您可以非常自信地识别特定的PRNG序列,但即使是简单的障碍,例如严格序列中缺少数字也会使其变得更加困难。还有很多PRNG你将无法可靠地检测到,通常你会对比赛(对于一个可攻击的PRNG)有接近100%的置信度,或者对任何比赛都有0%的置信度。

PRNG是否是可攻击的(因此可以通过它发出的数字检测到)并不是PRNG质量的一般指标。显然,“hackable”与“secure”的要求相反,因此不要将Mersenne Twister视为创建不可编码的代码。但是,请将其视为例如随机性的来源。神经网络,遗传算法,蒙特卡罗模拟以及其他需要大量统计随机数据的地方。

答案 2 :(得分:2)

你可以为候选生成器列表编写一组测试,但是有很多生成器,有些生成器具有巨大的状态,其中种子播种器的相邻值将显示没什么用处,你必须看到等待很长时间才能得到两个有信息关系的数据点。

好的一面;虽然您可能遇到的随机数生成器列表很多,但有一些标志可以帮助您快速识别某些类型的简单生成器,然后您可以执行聚焦分析以获得特定配置。

不幸的是,即使像KISS这样的简单生成器也会显示,当您知道其配置时,生成器可以简单地broken,但它可以将其签名隐藏在任何不知道其配置的内容中,让您进入在这种情况下,您必须单独测试每种可能的配置。

有像dieharderTestU01这样的质量测试会消耗许多兆字节的数据来识别生成器中的任何弱点;然而,这些也可以识别真实RNG中的弱点,因此它们可能会产生强烈的误报。

要仅消耗100个整数,您需要记住生成器列表。例如,要检测不恰当使用的LCG,您只需测试底部三位是否循环通过8个值的重复模式 - 但这是迄今为止最简单的情况。