Java BigInteger,pow方法只接受int
我正在做一个DSA签名验证和验证任务,我需要执行如下计算:Java BigInteger,pow方法只接受int,java,security,biginteger,Java,Security,Biginteger,我正在做一个DSA签名验证和验证任务,我需要执行如下计算:v=((g)^u1(y)^u2)mod p)mod q,其中g,u1,y,u2,p和q都是biginger对象,我被g^u1和y^u2卡住了,我想用这个方法来进行计算,但是这个方法只接受int参数,所以我不能像这样计算g^u1: g.pow(u1); 这个方法只接受int参数是合理的,因为在这种情况下,g是一个1024位的素数,u1这里等于6660753615843397574218515470666106767879287196,g^
v=((g)^u1(y)^u2)mod p)mod q
,其中g,u1,y,u2,p和q都是biginger
对象,我被g^u1
和y^u2
卡住了,我想用这个方法来进行计算,但是这个方法只接受int
参数,所以我不能像这样计算g^u1
:
g.pow(u1);
这个方法只接受int参数是合理的,因为在这种情况下,
g
是一个1024位的素数,u1
这里等于6660753615843397574218515470666106767879287196
,g^u1
的结果将变得非常大。我的问题是,我应该如何计算v=((g)^u1(y)^u2)mod p)mod q
你无论如何都要做mod p
,那么你为什么不使用
注意
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
,这些计算可以使用<代码>((g)^u1(y)^u2)模块p将为:
g.modPow(u1,p).multiply(y.modPow(u2,p)).mod(p)
不管怎样,您都要执行
mod p
,那么为什么不使用