在 java ,我有一个 DSAPrivateKey
,具有 X
参数,以及 DSAParams
与 P
, Q
以及 G
参数。我想计算相应的 DSAPublicKey
. 我知道我可以建造一个 DSAPublicKeySpec
如果我知道 Y
, P
, Q
,和 G
,然后我就可以使用 KeyFactory.generatePublic(KeySpec)
方法将其转化为 DSAPublicKey
.
我不确定的是怎么计算 Y
已知 X
, P
, Q
以及 G
. 我猜答案是:
BigInteger y = g.multiply(x).mod(p);
但这就产生了一个例外:
Caused by: java.lang.IllegalArgumentException: Y value does not appear to be in correct group
at org.bouncycastle.crypto.asymmetric.KeyUtils.validated(Unknown Source)
at org.bouncycastle.crypto.asymmetric.AsymmetricDSAPublicKey.<init>(Unknown Source)
at org.bouncycastle.jcajce.provider.ProvDSAPublicKey.<init>(Unknown Source)
所以很明显这个猜测是不对的。我也试过:
BigInteger y = g.modPow(x, p);
也有同样的例外。
我使用的是bouncycastle fips版本1.0.2,所以我很高兴有一个使用bouncycastle类的答案,但我也很高兴有一个不使用bouncycastle类的答案
1条答案
按热度按时间lkaoscv71#
你用乘法得到y值是对的。我发现了一个非常方便的解决方案,它可以与本机java一起工作。
安全警告:示例程序没有异常处理,仅用于教育目的。
有一个愉快的周末!
下面是我的示例程序的(简短)结果:
完整代码: