我找到了这个名为jsbn2的大整数库,由Tom Wu提供, 它似乎工作得很好,直到我不得不使用modInverse方法。 出于某种原因,无论如何,它都会返回 undefined 。 库中的方法是:
bnModInverse(m) {
var ac = m.isEven();
if((this.isEven() && ac) || m.signum() == 0) return new BigInteger(0);
var u = m.clone(), v = this.clone();
var a = new BigInteger(1), b = new BigInteger(0), c = new BigInteger(0), d = new BigInteger(1);
while(u.signum() != 0) {
while(u.isEven()) {
u.rShiftTo(1,u);
if(ac) {
if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
a.rShiftTo(1,a);
}
else if(!b.isEven()) b.subTo(m,b);
b.rShiftTo(1,b);
}
while(v.isEven()) {
v.rShiftTo(1,v);
if(ac) {
if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
c.rShiftTo(1,c);
}
else if(!d.isEven()) d.subTo(m,d);
d.rShiftTo(1,d);
}
if(u.compareTo(v) >= 0) {
u.subTo(v,u);
if(ac) a.subTo(c,a);
b.subTo(d,b);
}
else {
v.subTo(u,v);
if(ac) c.subTo(a,c);
d.subTo(b,d);
}
}
if(v.compareTo( BigInteger.ONE ) != 0) return new BigInteger(0);
if(d.compareTo(m) >= 0) return d.subtract(m);
if(d.signum() < 0) d.addTo(m,d); else return d;
// MODIFIED BY ATS 2008/11/22 FOR COMPATIBILITY TO Flash ActionScript
// if(d.signum() < 0) return d.add(m); else return d;
if(d.signum() < 0) return d.ope_add(m); else return d;
};
我使用了很长的数字,例如。
var a = new BigInteger("26243431849380303664210129223718904471391758038739441955848319764858899645035");
var b = new BigInteger("fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f", 16);
(固定b值,ty Rudy Velthuis)
但是a.modInverse(b)
返回undefined。
该方法有问题,需要修复吗? 我怎样才能使它发挥作用?
答案 0 :(得分:0)
好的..在数百个日志和东西之后我终于发现了我的问题是什么问题。 虽然我提出的示例值本身似乎确实有效,但modInverse方法存在一个不同的问题(再次......如果误导了某人,则抱歉)。
它的问题(jsbn2中的modInverse方法)是它不知道如何处理负数字(而Java modInverse知道)。
我对此的解决方案是检查我给它的值是否为正,如果没有,我准备它(感谢this topic for explaining how):
if(a.compareTo(ZERO)<0)
{
a = a.negate(); //make it positive
a = a.mod(b); //get modulo
a = b.subtract(a); //get remainder of modulo
}
我不知道这是否是最好的解决方案(当然不是),但它似乎有效。 我测试的结果值现在等于Java的modInverse。
希望这能帮助像我这样迷路的人:3