在 PHP 中是否有可能预测 rand(0,10)?

2022-08-31 00:19:48

我有一个脚本,我在PHP中使用rand函数。现在我读到一些鬼故事,预测这些结果真的很容易。从客户端是否可以执行此操作?

例如,假设我们有一个 .是否有可能预测下一个数字?rand(0,10)


答案 1

rand()函数返回一个伪随机数 。这并不意味着这个数字是可以预测的。然而,这个图像可以解释单词的概念nextpseudorandom

rand

您可以阅读本文

图像是从Windows系统上具有功能的简单循环生成的。rand

header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y = 0; $y < 512; $y++) {
    for ($x = 0; $x < 512; $x++) {
        if (rand(0, 1)) {
            imagesetpixel($im, $x, $y, $white); 
        } 
    } 
} 
imagepng($im); imagedestroy($im);

这不是那么随机,真的吗?但是现在你知道了...你能预测下一个数字吗?

真随机数生成器(TRNGs)和伪随机数生成器(PRNG)之间的区别在于TRNG使用不可预测的物理方法来生成数字(如大气噪声),而PRNG使用数学算法(完全由计算机生成)

[...]

没有多少PRNG会产生像这样的明显视觉模式,它只是碰巧是语言(PHP),操作系统(Windows)和功能(rand())的一个非常糟糕的组合。


答案 2

您必须暴力破解 PRNG 的状态。http://crypto.di.uoa.gr/CRYPTO.SEC/Randomness_Attacks_files/paper.pdf

PHP的rand()使用底层标准库实现,这根据操作系统而有所不同。

因此,第一步,定义操作系统。

下一步,获取 Rand() 函数的源代码及其种子代码。

为简单起见,让我们假设 PRNG 的种子类似于服务器的毫秒时间。因此,HTTP 请求传入,PHP 播种 PRNG 并执行 rand(0,10)。如果你想预测你会...

  • 将客户端的时钟同步到服务器的时钟,从统计上得出从向服务器发送 HTTP 请求并读取带有时间戳的响应 HTTP 标头的确切时间。

  • 为客户端 PRNG(与服务器的实现相同)设定一个预测的未来时间,您将从服务器请求 rand(0,10)。在客户端上运行rand(0,10),在确切的将来时间将请求发送到服务器,结果将是相同的。

  • Ping时间,处理时间等使这成为一种相当暴力的方法。

真的,通过互联网(不能直接访问服务器),你不会有太多的运气来预测PHP的rand()函数的结果。


推荐