当前位置: 首页 > 知识库问答 >
问题:

利用secp256r1曲线和SHA256算法-BouncyCastle生成ECDSA签名

郝玄天
2023-03-14

我试图用ECDSA和secp256r1曲线(P256)和SHA256算法来生成签名。我也在使用弹力城堡图书馆。下面的代码,

public class MyTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
        new MyTest().getSign();
    }

    void getSign() {
        // Get the instance of the Key Generator with "EC" algorithm

        try {
            KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
            ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
            g.initialize(kpgparams);

            KeyPair pair = g.generateKeyPair();
            // Instance of signature class with SHA256withECDSA algorithm
            Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
            ecdsaSign.initSign(pair.getPrivate());

            System.out.println("Private Keys is::" + pair.getPrivate());
            System.out.println("Public Keys is::" + pair.getPublic());

            String msg = "text ecdsa with sha256";//getSHA256(msg)
            ecdsaSign.update((msg + pair.getPrivate().toString())
                    .getBytes("UTF-8"));

            byte[] signature = ecdsaSign.sign();
            System.out.println("Signature is::"
                    + new BigInteger(1, signature).toString(16));

            // Validation
            ecdsaSign.initVerify(pair.getPublic());
            ecdsaSign.update(signature);
            if (ecdsaSign.verify(signature))
                System.out.println("valid");
            else
                System.out.println("invalid!!!!");

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }

    }

}

共有1个答案

田硕
2023-03-14

头奖-没有任何在你的标题是一个问题!

首先,您可能实际上并没有使用BouncyCastle。Sun/Oracle Java7和8现在包括一个EC提供程序(早期版本没有),并且GetInstance的one-arg形式使用第一个可用的提供程序,通常是SunEC,除非您或某人更改了提供程序列表。

要验证签名:向验证signature.update()传递与向签名signature.update()传递相同的数据。完全一样,字节对字节。只将签名值传递给signature.verify()。将privatekey.tostring()放入数据是愚蠢的;这个值是特定于正在运行的Java进程的,所以您必须将它发送到接收进程(如果不同,通常应该是这样),在那里它是无用的,而且浪费空间。

使用.getkey(字符串别名,char[]password)和强制转换来获取privatekey。用于签名。

使用.getCertificateChain(字符串别名)[0].getPublicKey()从第一个(仅有)证书中获取公钥。用于验证。

 类似资料:
  • 我正在使用secp256r1曲线和使用BouncyCastle的SHA256算法实现ECDSA签名生成。 对于某些输入,签名长度为127个字符。我感觉开头的“0”被删除了,因为签名被存储到ECDSASigner类中的BigInteger datatype中。 我使用确定性方法添加了rfc6979 ECDSA签名中的示例 唯一的区别是r值中的零。因为签名的长度只有127。 如果我的推论是正确的,请让

  • 下面是我的场景--我从条形码中读取数据,并将其转换为纯文本。本文是条码数据+数字签名的结合。数字签名附加在末尾,使我能够分离出实际数据和数字签名数据。数字签名数据使用sha256哈希-用户将公钥作为windows证书文件()发送给我。 所需实现:-需要从证书中提取公钥,并根据提供的条形码数据和数字签名验证公钥。 问题:

  • 问题内容: 我正在尝试实现ECDSA(椭圆曲线数字签名算法),但是在Java中找不到使用Bouncy Castle的示例。我创建了密钥,但是我真的不知道我应该使用哪种功能来创建签名并进行验证。 问题答案: owlstead是正确的。要详细说明,您可以执行以下操作: 并验证:

  • 我应该如何更改A方法?任何想法都是好的。提前谢谢。

  • 我能够使用带RSA私钥的bouncy castle和“SHA256withRSA”算法对证书进行签名。我使用下面的链接作为参考来实现这一点。使用Bouncy Castle签署CSR 现在我有椭圆曲线密钥与ECDSA签署我的CA。因此,我想通过这些CA用EC密钥和“SHA256 with ECDSA”算法签署证书。然而,我被困在下面的片段特定于RSA密钥,我想使用EC密钥。 请帮助我如何使用ECDS

  • 我有代码使用为ECDSA签名生成串联(r-s)签名和JWK格式的密钥: 似乎有效。我也有使用来实现相同目标的代码: 这两者都返回128字节的缓冲区;并且它们可以交叉验证(例如,我可以用< code>SubtleCrypto验证< code > JSR sign 签名,反之亦然)。然而,当我在Node.js 模块中使用< code>Sign类时,我似乎得到了完全不同的东西。 在这里,我得到了一个可变