2

文字列を暗号化し、http 経由で PHP スクリプトに送信する lua スクリプトがあります。問題は、暗号化プロセスが Lua のmath.randomseedand を使用することmath.randomです。PHP で文字列を復号化しようとすると、Luamt_srandmt_randは異なる数値が生成されます。

Luaのようにphpで数値を生成するにはどうすればよいですか?

- 編集

さて、私の(非常に単純な)暗号化では、キーを使用してシードを生成しています。そのシードにより、毎回同じ「乱数」を取得できます。

したがって、キーがたとえば 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 に答える