在PHP中计算RSA私钥的更快捷方式

时间:2012-11-14 23:00:43

标签: php rsa private-key

嗨我需要在php中自己实现RSA算法。我遇到的唯一问题是计算私钥的部分。我的函数的工作方式是获取一个随机数并检查它是否适合私钥公式。这工作正常,但唯一的问题是,当使用非常大的数字时,它需要年龄和页面超时。我想知道,有没有更好的方法可以实现这一点,而不必继续生成随机数?这是必需的代码:

$decrypt = rand(1,($phi-1));
while(!private($decrypt, $encrypt, $phi)){
$decrypt = rand(1,($phi-1));
}

...

function private($decrypt, $encrypt, $phi) {

 if(($decrypt * $encrypt) % ($phi) == 1){
 Return true;
 }
 else{
 Return false;
 }
}

2 个答案:

答案 0 :(得分:1)

这种方法不起作用。 PHP数字类型是双精度浮点数,因此不能表示大约超过53位的整数。您很可能需要使用PHP多精度库,例如bcmathgmp。这仍然不会很快,但它至少会给出正确的结果。

答案 1 :(得分:0)

选项1:

你最好按顺序做这件事。你的rand()可以找到之前使用过的数字。假设你的最大值是10,需要的数字是8或4,rand()你可以得到3,5,9,10,3,6,2,7,3,6,9,10,1,3, 5,6,3,7,8在回答之前。如果按顺序运行,则最多有10个调用来获取它。

但是,你需要一个随机数,所以你可能应该从一个随机数开始,然后按顺序增加直到你得到一个命中 - 这样你可以得到8,或者你可以得到4,这取决于你的起点。 / p>

选项2:

之后,您可以在数学上做其他解决方案。从随机数开始,计算模数是什么,与1的差异(如果为负,则添加$phi)。然后,您可以从1运行到$decrypt以查找修改后的数字与1之间的差异,然后添加该数字以加密您的响应。

$decrypt = 7
$encrypt = 9
$phi = 3
($decrypt * $encrypt) % ($phi) = 0
$differenceInMod = 1 - ($decrypt * $encrypt) % ($phi) = 1;
if ($differenceInMod < 0) {
    $differenceInMod+=$phi;
}
for($i = 1; $i<$decrypt; $i++) {
   if (($decrypt * $i) % ($phi) == $differenceInMod) {
      $validEncrypt = $encrypt + $i;
      break;
   }
}

可能没有那么快的顺序(选项1) - 但是数字较小而你有限制。

相关问题