繁体   English   中英

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

[英]Quicker way to calculate RSA private key in PHP

嗨,我需要在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;
 }
}

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

选项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。

选项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)更快-但数字更小且有限制。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM