我有一个lua脚本,用于加密字符串并通过http将其发送到PHP脚本。问题是,加密过程使用Lua的math.randomseed
和math.random
。在尝试使用PHP解密字符串时,mt_srand
和mt_rand
生成的数字与Lua不同。
如何让php生成像Lua这样的数字?
- 编辑
好的,所以在我(非常简单)的加密中我使用密钥生成种子。那个种子让我每次都能得到相同的“随机数”。
所以,如果我的密钥产生了一个说80的种子,我在Lua中使用它......
math.randomseed(80)
local randomNumber = math.random(1, 20)
// randomNumber = 3
当尝试在PHP中解密时,我会使用相同的种子,但我会得到不同的输出。
mt_srand(80);
$randomNumber = mt_rand(1, 20);
// $randomNumber = 10
我需要找出一种方法来取回相同的数字,以便我能够解密字符串。
答案 0 :(得分:2)
而不是试图通过从Lua或PHP复制现有的随机函数来重新发明轮子。我发现使用以下链接的方法要容易得多。只需将代码移植到Lua,一切都很顺利。显然,它不适合每个人的情况,但对于我如何使用它,它是完美和简单的。 http://www.sitepoint.com/php-random-number-generator/
class Random {
// random seed
private static $RSeed = 0;
// set seed
public static function seed($s = 0) {
self::$RSeed = abs(intval($s)) % 9999999 + 1;
self::num();
}
// generate random number
public static function num($min = 0, $max = 9999999) {
if (self::$RSeed == 0) self::seed(mt_rand());
self::$RSeed = (self::$RSeed * 125) % 2796203;
return self::$RSeed % ($max - $min + 1) + $min;
}
}
我唯一改变的是默认种子,并使用mt_rand()
删除了该行然后在Lua中我创建了以下代码:
local mySeed = 0;
function setSeed(s)
mySeed = math.abs(tonumber(s)) % 9999999 + 1;
myRand();
end
function myRand(min, max)
min = min or 0;
max = max or 9999999;
mySeed = (mySeed * 125) % 2796203;
return mySeed % (max - min + 1) + min;
end
答案 1 :(得分:1)
你需要一个随机数发生器,它在php和lua上使用相同的算法。
要么为Lua找到一个随机数生成器,要么为PHP找到一个具有相同实现的随机数生成器,或者你必须编写自己的一个。此外,使用系统实习生也很糟糕,因为它们可以随时更改,然后您的脚本也不再有效。