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^u1
和y^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 ^ u1
和 b = y ^ u2
,这些计算可以使用 modPow 高效地完成。 ((g)^u1(y)^u2) mod p
将是:
g.modPow(u1,p).multiply(y.modPow(u2,p)).mod(p)
我正在执行 DSA 签名验证和验证分配,我需要执行如下计算:v = (((g)^u1(y)^u2) mod p) mod q
,其中 g、u1、y、u2、p 和 q 都是 BigInteger
对象,我卡在了g^u1
和y^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 ^ u1
和 b = y ^ u2
,这些计算可以使用 modPow 高效地完成。 ((g)^u1(y)^u2) mod p
将是:
g.modPow(u1,p).multiply(y.modPow(u2,p)).mod(p)