有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我试图实现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();
}

共 (3) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

  3. # 3 楼答案

    猫头鹰是对的。更详细地说,你可以这样做:

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