Java pow BigInteger实现

时间:2015-03-07 08:25:31

标签: java cryptography biginteger pow exponent

我正在开发加密实现,部分设计包括以下内容:

((y ^ a)^ b /(y ^ c)^ b)mod p

我有以下代码段:

BigInteger yab = y.pow(ab.intValue());
BigInteger ycb = y.pow(cb.intValue());

BigInteger ans = (yab.divide(ycb)).mod(p);

适用于小整数。一旦我用生成的密钥替换它,指数变得如此巨大,我将点击“BigInteger out of int range”错误。我尝试过modPow函数,但结果不同。

我知道将它转换为int有其局限性。这是否意味着我的实施是不可行的?

2 个答案:

答案 0 :(得分:3)

好像你正在小组enter image description here进行模块化算术,其中 n 是素数(在你的情况下是 n = p < / em>的)。这意味着

x / y

不是除法,而是 x y -1 的乘法( y的模块化逆 )。

好的是BigInteger类提供了这样一种方法:

BigInteger ans = yab.multiply(ycb.modInverse(p)).mod(p);

其中yabycb可以有效地计算而不会溢出(假设abab的乘积):

BigInteger yab = y.modPow(ab, p);
BigInteger ycb = y.modPow(cb, p);

答案 1 :(得分:2)

您可以简化代码,这也会使代码更快

x^y / x^z = x^(y - z)

所以

BigInteger yab = y.pow(ab.intValue());
BigInteger ycb = y.pow(cb.intValue());

BigInteger ans = (yab.divide(ycb)).mod(p);

可以简化为

BigInteger yabc = y.pow((int) (ab.longValue() - cb.longValue()));
BigInteger ans = yabc.mod(p);

BigInteger and = y.modPow(ab.minus(cb), p);