在 PHP 中是否有可能预测 rand(0,10)?
我有一个脚本,我在PHP中使用rand函数。现在我读到一些鬼故事,预测这些结果真的很容易。从客户端是否可以执行此操作?
例如,假设我们有一个 .是否有可能预测下一个数字?rand(0,10)
我有一个脚本,我在PHP中使用rand函数。现在我读到一些鬼故事,预测这些结果真的很容易。从客户端是否可以执行此操作?
例如,假设我们有一个 .是否有可能预测下一个数字?rand(0,10)
rand()
函数返回一个伪随机数 。这并不意味着这个数字是可以预测的。然而,这个图像可以解释单词的概念next
pseudorandom
您可以阅读本文
图像是从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())的一个非常糟糕的组合。
您必须暴力破解 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()函数的结果。