Jas*_*n X 0 java android bouncycastle spongycastle
我正在尝试使用 SpongyCastle 在 Android 上验证 ECDSA 数字签名。我有一个X509Certificate包含我需要用来验证它的公钥,但我无法弄清楚如何获得PublicKey(向下转换ECPublicKey)以用于ECDSASigner该类。
我已经使用 C# 版本的 BouncyCastle 完成了这个,它看起来像这样:
ECDsaSigner signer = new ECDsaSigner();
signer.Init(false, cert.GetPubliKey());
Run Code Online (Sandbox Code Playgroud)
在 API 的 Java 版本中,该X509Certificate.getPublicKey()方法返回一个PublicKey类而不是AsymmetricKeyParameter. 但是,该ECDSASigner.init()方法需要一个CipherParameters对象。我不知道如何为 ECDSA 做到这一点。
对于 RSA 签名,我只是手动重建了一个新RSAKeyParameters对象:
RSAEngine engine = new RSAEngine();
engine.init(
false,
new RSAKeyParameters(
false,
((RSAPublicKey) pubKey).getModulus(),
((RSAPublicKey) pubKey).getPublicExponent()
)
);
Run Code Online (Sandbox Code Playgroud)
这似乎并不理想,但我认为它应该有效。但我什至不知道如何为 ECDSA 做这个等价物。我认为有更好的方法可以做到这一点,但我无法找出要使用的正确 API。
我想我终于明白了这一点。看起来我需要使用Signature类来处理这个问题,而不是ECDSASigner直接使用类。我仍然想了解这个ECDSASigner类是如何在所有这些抽象内部使用的(只是为了我自己的好奇心)。
无论如何,这就是我的代码用于验证 ECDSA 签名的样子(至少供我使用)。希望这将有助于一些未来试图解决类似问题的人:
Signature sig = Signature.getInstance("NONEwithECDSA", "BC");
sig.initVerify(pubKey);
sig.update(plainBytes);
if (!sig.verify(signedBytes)) {
throw new Exception("ECDSA signature verification failed.");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1891 次 |
| 最近记录: |