java.math.BigInteger,pow方法只接受int

时间:2015-01-04 11:33:27

标签: java security biginteger

我正在进行DSA签名验证和验证分配,我需要执行如下计算:v = (((g)^u1(y)^u2) mod p) mod q,其中g,u1,y,u2,p和q都是{{ 1}}对象,我遇到了BigIntegerg^u1,我想使用pow方法进行计算,但此方法只接受y^u2参数,所以我无法像这样计算int

g^u1

这个方法只接受int参数是合理的,因为在这种情况下,g.pow(u1); 是1024位素数,g这里等于u1,结果是666075361584433975742185154706661067887879287196会变得非常大。我的问题是,我应该如何执行g^u1的计算。

2 个答案:

答案 0 :(得分:2)

确实g^u1变得非常大。但是,您可以利用

这一事实
a * b  mod  n

可以计算为

(a mod n  *  b mod n)  mod  n

此处a = g ^ u1b = y ^ u2可以使用modPow有效地完成这些计算。 ((g)^u1(y)^u2) mod p将是:

g.modPow(u1,p).multiply(y.modPow(u2,p)).mod(p)

答案 1 :(得分:1)

无论如何你都会mod p - 所以为什么不使用BigInteger.modPow()

请注意

g^u1 * y^u2 mod p == (g^u1 modp * y^u2 mod p) mod p