11

我正在尝试实现 ECDSA(椭圆曲线数字签名算法),但我在 Java 中找不到任何使用 Bouncy Castle 的示例。我创建了密钥,但我真的不知道应该使用什么样的函数来创建签名并验证它。

public static KeyPair GenerateKeys()
    throws NoSuchAlgorithmException, NoSuchProviderException, InvalidAlgorithmParameterException
{
    ECParameterSpec ecSpec = ECNamedCurveTable.getParameterSpec("B-571");
    KeyPairGenerator g = KeyPairGenerator.getInstance("ECDSA", "BC");
    g.initialize(ecSpec, new SecureRandom());
    return g.generateKeyPair();
}
4

3 回答 3

18

owlstead 是正确的。为了详细说明,您可以这样做:

KeyPair pair = GenerateKeys();
Signature ecdsaSign = Signature.getInstance("SHA256withECDSA", "BC");
ecdsaSign.initSign(pair.getPrivate());
ecdsaSign.update(plaintext.getBytes("UTF-8"));
byte[] signature = ecdsaSign.sign();

并验证:

Signature ecdsaVerify = Signature.getInstance("SHA256withECDSA", "BC");
ecdsaVerify.initVerify(pair.getPublic());
ecdsaVerify.update(plaintext.getBytes("UTF-8"));
boolean result = ecdsaVerify.verify(signature);
于 2013-08-15T22:58:16.370 回答
7

BouncyCastle 是一个提供者:一组类,它们提供一些加密功能,应用程序应该通过 Java 附带的通用 API 使用这些功能。请参阅Java Cryptography Architecture,尤其是有关签名的部分,以了解如何生成或验证签名。基本上,您会获得一个java.security.Signature实例(使用静态getInstance()方法),然后使用私钥(initSign()用于生成签名)或公钥(initVerify()用于验证签名)对其进行初始化。然后通过一个或几个update()调用输入消息数据,最后调用sign()orverify()来生成或验证签名。

于 2013-08-15T01:39:00.803 回答
2

您似乎主要将 Bouncy Castle 用作提供者。在这种情况下,您可以简单地使用Signature.getInstance("SHA256withECDSA", "BC").

于 2013-08-15T16:32:57.010 回答