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

在PHP中快速计算RSA私钥的方法,php,rsa,private-key,Php,Rsa,Private Key,嗨,我被要求在php中自己实现RSA算法。我唯一有问题的是计算私钥的部分。我的函数的工作方式是获取一个随机数并检查它是否符合私钥公式。这很好,但是唯一的问题是,当使用非常大的数字时,需要花费很长时间,页面超时。我想知道,有没有更好的方法,我可以实现这一点,而不必不断生成随机数?以下是所需的代码: $decrypt = rand(1,($phi-1)); while(!private($decrypt, $encrypt, $phi)){ $decrypt = rand(1,($phi-1));

嗨,我被要求在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多精度库,如或。这仍然不会很快,但至少会给出正确的结果。

选项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
,找出modded与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;
   }
}
$decrypt=7
$encrypt=9
$phi=3
($decrypt*$encrypt)%($phi)=0
$differenceimod=1-($decrypt*$encrypt)%($phi)=1;
如果($differencenmod<0){
$differenceimod+=$phi;
}

对于($i=1;$iI),我将限制数字,使其低于最大整数值。算法中的前两个素数(p和q)受到限制,因此它们不会超出最大值。因此,算法的其余部分在限制范围内。问题只是找到一种更快的方法来计算私钥,即使
p
q
都在允许的范围内,
p*q
可能不在允许的范围内,溢出将导致精度降低迷路了。对不起,我没有说清楚-p和q都在限制范围内,所以即使是p*q也会在限制范围内(仅限于此)有没有另一个公式可以用来计算私钥?我很确定有一个数学方法可以解决这个问题,它不需要随机数是的。第二个例子的原因是你可以进一步得到$I。但它并不简单,我也从来没有试过。给你一个简单的阅读:。有几个例子在如何计算模数的页面上添加es,祝你好运。编辑:一个更好地解释它的页面: