【问题标题】:DSA Signature Verification and BigInteger classDSA 签名验证和 BigInteger 类
【发布时间】:2018-09-17 21:06:14
【问题描述】:

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

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

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

r.modPow(指数, 模数);

我不知道如何通过 BigInteger 完成上述等式(尤其是粗体部分),我想知道这是否可能。有人有什么想法吗?

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

【问题讨论】:

  • 要回答如何在 PARI/GP 中做到这一点,您只需 V = ((y^u1*h^u2) % p) % q。但是,这不会使用下面答案描述的优化。为此(仅当中间值很大时才需要,但我猜几乎总是更快),请尝试V = lift(Mod(y,p)^u1*Mod(h,p)^u2) % q

标签: java encryption biginteger dsa pari


【解决方案1】:

我想你只需要使用那个身份

(a*b) mod p == ((a mod p)*(b mod p)) mod p

所以要计算yu1 × hu2 mod p:

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

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

【讨论】:

    猜你喜欢
    • 2011-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-24
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    相关资源
    最近更新 更多