2

我有一个 lua 脚本,它加密一个字符串并通过 http 将其发送到 PHP 脚本。问题是,加密过程使用 Luamath.randomseedmath.random. 尝试在 PHP 中解密字符串mt_srandmt_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

我需要找到一种方法来取回相同的数字,以便能够解密字符串。

4

2 回答 2

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
于 2013-11-14T17:48:08.063 回答
1

你需要一个随机数生成器,它在 php 和 lua 上使用相同的算法。

要么你找到一个用于 Lua 的随机数生成器和一个用于 PHP 的具有相同实现的随机数生成器,或者你必须编写自己的一个。此外,使用系统实习生生成器也很糟糕,因为它们可以随时更改,然后您的脚本也不再有效。

于 2013-11-14T17:09:53.940 回答