2013-11-14 81 views
2

我有一个lua脚本来加密一个字符串并通过http发送给一个PHP脚本。问题是,加密过程使用Lua的math.randomseedmath.random。当试图在PHP中解密字符串时,mt_srandmt_rand产生与Lua不同的数字。Lua vs PHP随机数字

我怎样才能让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 

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

+2

让我看看,如果我理解,你有一个随机数发生器产生不同数字的问题? –

+0

你需要给我们更多关于你想要实现的细节。 – lhf

+0

增加了更多细节 – user1960364

回答

1

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

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

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 
+0

有一个标准的警告关于滚动你自己的加密,我想你会发现,如果你依赖于这个除了简单的混淆之外的任何东西警告。这两种(所有)平台在自己的代码中实现相同的生成器的技术是完善的。只要这不能保护你的日记甚至是有价值的东西,你就会好起来的。 – RBerteig