jsbn2 modInverse返回undefined

时间:2016-03-09 11:01:37

标签: javascript undefined biginteger

我找到了这个名为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。

该方法有问题,需要修复吗? 我怎样才能使它发挥作用?

1 个答案:

答案 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