我正在尝试实现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();
}
答案 0 :(得分:15)
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);
答案 1 :(得分:5)
BouncyCastle是一个提供程序:一组类,它提供了应用程序应该通过Java附带的通用API使用的一些加密功能。请参阅Java Cryptography Architecture,尤其是有关签名的部分,以了解如何生成或验证签名。基本上,您获得java.security.Signature
实例(使用静态getInstance()
方法),然后使用私钥(initSign()
,生成签名)或公钥({{ {1}},以验证签名)。然后,您通过一个或多个initVerify()
来电输入消息数据,最后拨打update()
或sign()
,以生成或验证签名。
答案 2 :(得分:1)
您似乎主要使用Bouncy Castle作为提供者。在这种情况下,您只需使用Signature.getInstance("SHA256withECDSA", "BC")
。