使用 SpongyCastle 验证 ECDSA 签名

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。

Jas*_*n X 5

我想我终于明白了这一点。看起来我需要使用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)