BouncyCastle上的椭圆曲线数字签名算法(ECDSA)实现

10

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

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();
}

它并没有帮助,但我也在crypto.stackexchange.com上创建了同样的问题。 - Yagiz
1
几年前,正确使用加密库的代码示例是一个热门话题。我不确定现在是否仍然如此。...虽然拥有一个充满准确、经过审核的安全相关代码的地方会很好。 - makerofthings7
3个回答

19

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);

Java安全API提供程序名称现在是SC而不是BC。 - JDOaktown
2
"BC" 是 BouncyCastle,而 "SC" 是 SpongyCastle,它们是两个不同的提供者。问题是关于 BouncyCastle 的,这意味着 "BC" 是正确的,但 "SC" 不是。 - John Smith
1
自从这篇答案发布以来,BC的API似乎已经发生了巨大变化。1.60版本不再适用于此示例代码 :( - Xenonite
我该如何获取“pair”实例进行验证?这不能是GenerateKeys();,否则它将生成与签名公钥不同的公钥。我在这里感到困惑。 - Mukit09

7
BouncyCastle是一个提供者:一组类,提供了某些加密功能,应用程序通过Java自带的通用API来使用。请参阅Java Cryptography Architecture,特别是签名部分,以了解如何生成或验证签名。基本上,您会得到一个java.security.Signature实例(使用静态方法getInstance()),然后您将其初始化为私钥(initSign(),用于生成签名)或公钥(initVerify(),用于验证签名)。然后,您使用一个或多个update()调用输入消息数据,最后调用sign()verify()来生成或验证签名。

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接