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

java.math.BigInteger, pow method only accepts int

我正在执行 DSA 签名验证和验证分配,我需要执行如下计算:v = (((g)^u1(y)^u2) mod p) mod q,其中 g、u1、y、u2、p 和 q 都是 BigInteger对象,我卡在了g^u1y^u2,我想用pow方法来计算,但是这个方法只接受int参数,所以我无法像这样计算 g^u1

g.pow(u1);

这个方法只接受int参数是合理的,因为在这种情况下,g是一个1024位的素数,而u1这里等于666075361584433975742185154706661067887879287196,[=的结果14=] 将变得非常大。我的问题是,我应该如何计算 v = (((g)^u1(y)^u2) mod p) mod q.

无论如何你都要做 mod p - 那你为什么不使用 BigInteger.modPow()

请注意

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

确实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)