DSA 签名验证和 BigInteger class

DSA Signature Verification and BigInteger class

我得到了一个(非常)简单的 DSA 问题,并且已经找到了密钥和其他变量。为了验证签名,我需要以某种方式翻译等式:

V = [(y^u1*h^u2)mod p] mod q

进入 BigInteger 操作。这在 java 上有可能吗?到目前为止,我一直在成功地使用 modPow,但是到目前为止所有的问题都是以下形式:

r.modPow(指数,modulus);

我不知道如何通过 BigInteger 计算上面的等式(特别是粗体部分),我想知道这是否可能。有人有什么想法吗?

如果 BigInteger 做不到,我该如何通过 Pari 计算这个等式?

我认为你只需要使用

的身份
(a*b) mod p == ((a mod p)*(b mod p)) mod p

所以要计算yu1×hu2modp:

  1. 计算 yu1 mod p,使用 modPow,
  2. 计算 hu2 mod p, 使用 modPow,
  3. 将第 1 步和第 2 步的结果相乘,
  4. 减少第 3 步的结果 mod p.

第 4 步是必要的,因为第 1 步和第 2 步的结果相乘可能会产生大于 p 的值。