JavaScript中模逆的计算

JavaScript中模逆的计算,javascript,algorithm,rsa,inverse,modular-arithmetic,Javascript,Algorithm,Rsa,Inverse,Modular Arithmetic,我试图取ed=1模((p-1)(q-1))并求解d,就像RSA算法一样 e=5,(p-1)*(q-1)=249996 我在javascript中尝试了很多代码,例如: function modInverse(){ var e = 5; var p = 499; var q = 503; var d = e.modInverse((p-1) * (q-1)); DisplayResult(d, "privateKeyResultLabel") } 或 在javascript中,我无法找到求解d的

我试图取ed=1模((p-1)(q-1))并求解d,就像RSA算法一样

e=5,(p-1)*(q-1)=249996

我在javascript中尝试了很多代码,例如:

function modInverse(){
var e = 5;
var p = 499;
var q = 503;
var d = e.modInverse((p-1) * (q-1));
DisplayResult(d, "privateKeyResultLabel")
}


在javascript中,我无法找到求解d的正确方法,即模逆。

我只是在浏览定义,并根据我的理解:

ax = 1 (mod m)
=> m is a divisor of ax -1 and x is the inverse we are looking for
=> ax - 1 = q*m (where q is some integer)
And the most important thing is gcd(a, m) = 1
i.e. a and m are co-primes
就你而言:

ed = 1 mod((p-1)(q-1)) //p, q and e are given 
=> ed - 1 = z*((p-1)(q-1)) //where z is some integer and we need to find d
同样,从,可以使用计算模逆,它执行以下操作:

 ax + by = g //where g = gcd(a,b) i.e. a and b are co-primes
 //The extended gcd algorithm gives us the value of x and y as well.
在你的例子中,等式如下:

 ed - z*((p-1)(q-1)) = 1; //Compare it with the structure given above

 a -> e
 x -> d
 b -> (p-1)(q-1)
 y -> z
因此,如果我们将该算法应用于这种情况,我们将得到
d
z
的值

对于
ax+by=gcd(a,b)
,扩展的gcd算法可能类似():

该算法在时间O(log(m)^2)中运行,假设a
我不知道javascript中是否有用于此的内置函数。我怀疑是否有,我是算法迷,所以我想你可能想试试这种方法。您可以对它进行修改,以处理您的值范围,我希望它能让您从正确的方向开始。

这种模块化逆的实现可以接受任何类型的输入。如果不支持输入类型,则返回
NaN
。而且,它不使用递归

函数修改反向(a,m){
//验证输入
[a,m]=[编号(a),编号(m)]
if(Number.isNaN(a)| Number.isNaN(m)){
返回NaN//无效输入
}
a=(a%m+m)%m
如果(!a | | m<2){
返回NaN//无效输入
}
//找到gcd
常数s=[]
设b=m
而(二){
[a,b]=[b,a%b]
s、 推送({a,b})
}
如果(a!==1){
return NaN//inverse不存在
}
//求逆
设x=1
设y=0
for(设i=s.length-2;i>=0;--i){
[x,y]=[y,x-y*Math.floor(s[i].a/s[i].b]
}
返回值(y%m+m)%m
}
//测验
console.log(modInverse(1,2))/=1
console.log(modInverse(3,6))/=NaN
console.log(modInverse(25,87))/=7
console.log(modInverse(7,87))/=25
console.log(modInverse(191212393831))/=701912218
log(modInverse(3173714876143))/=45180085378
log(modInverse(373714876143))/=NaN
console.log(modInverse(-7,87))/=62
console.log(modInverse(-25,87))/=80
console.log(modInverse(0,3))/=NaN

console.log(modInverse(0,0))/=NaN
System.out.println
?这是Java,不是Javascript。令人尴尬。。。我对编码真的很陌生。我需要javascript而不是java!我知道有一个modInverse()函数是javascript。我只是不知道如何正确使用它。你怎么知道JavaScript中有一个
modInverse()
?因为我很确定没有一个内置函数来实现它。不,当然没有内置函数(JavaScript的标准库非常小)。您可能会发现其他人构建的库具有这样的功能,但绝对不是在浏览器本身中。您可以实现扩展GCD而无需递归,因此它将在恒定空间中运行。非常感谢。我知道代码与扩展的欧几里德alg有关。我不确定如何存储这些值。阵列上的呼叫很好!
 ed - z*((p-1)(q-1)) = 1; //Compare it with the structure given above

 a -> e
 x -> d
 b -> (p-1)(q-1)
 y -> z
 function xgcd(a, b) { 

   if (b == 0) {
     return [1, 0, a];
   }

   temp = xgcd(b, a % b);
   x = temp[0];
   y = temp[1];
   d = temp[2];
   return [y, x-y*Math.floor(a/b), d];
 }