我正在进行DSA签名验证和验证分配,我需要执行如下计算:v = (((g)^u1(y)^u2) mod p) mod q
,其中g,u1,y,u2,p和q都是{{ 1}}对象,我遇到了BigInteger
和g^u1
,我想使用pow方法进行计算,但此方法只接受y^u2
参数,所以我无法像这样计算int
:
g^u1
这个方法只接受int参数是合理的,因为在这种情况下,g.pow(u1);
是1024位素数,g
这里等于u1
,结果是666075361584433975742185154706661067887879287196
会变得非常大。我的问题是,我应该如何执行g^u1
的计算。
答案 0 :(得分:2)
确实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)
答案 1 :(得分:1)