首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于secp256r1曲线和SHA256算法的ECDSA签名生成- BouncyCastle

基于secp256r1曲线和SHA256算法的ECDSA签名生成- BouncyCastle
EN

Stack Overflow用户
提问于 2014-08-12 18:18:31
回答 2查看 15.7K关注 0票数 3

我正在尝试使用带secp256r1曲线的ECDSA (P256)和用于消息散列的SHA256算法生成签名。此外,我还使用了Bouncy Castle库。下面的代码,

代码语言:javascript
复制
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();
        }

    }

}

这里的密钥对是使用KeyPair生成的,但为了满足我的需求,我将使用静态privateKey和公钥。此外,签名的验证总是返回false。

需要帮助,我怎样才能有静态私钥和验证部分。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-12 19:44:14

大奖-在你的标题中没有任何问题!

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

验证签名的数据传递给验证Signature.update(),就像您传递给签名Signature.update()一样。完全一样,一个字节接一个字节。将签名值only传递给Signature.verify()。将PrivateKey.toString()放入数据是愚蠢的;这个值特定于正在运行的Java进程,因此您必须将它发送到接收进程(如果不同,就像它通常应该的那样),在那里它是无用的,并且是浪费空间的。

使用静态密钥的就是这么做的。创建一个密钥对并将其存储在某个位置,然后读取并使用它。最简单的安全(受密码保护的)存储是Java (JKS)文件,但这需要一个证书链(可能是一个虚拟的),这对您编写代码来说是一件麻烦的事情;幸运的是,使用-genkeypairkeytool实用程序会生成一个带有虚拟自签名证书的密钥对,并且对于-keyalg ec -keysize 256,它使用(非常流行的) secp256r1曲线。还要指定您选择的-alias name-keystore filename、任何您喜欢的虚拟证书名称和密码。要使用JKS文件中的密钥对:

  • 使用java.security.KeyStore.getInstance("JKS")创建存储对象,并向.load(InputStream,char[])传递文件上的FileInputStream,以及password.
  • use .getKey(String alias,char[] password)和cast以获取PrivateKey。用于签名。
  • 使用.getCertificateChain(String alias)[0].getPublicKey()从第一个(仅限)证书获取PublicKey。用于验证。
票数 8
EN

Stack Overflow用户

发布于 2021-07-08 15:16:07

我决定将初始问题的代码更新为最终的工作版本,以供将来的读者使用。

代码语言:javascript
复制
    try {
        KeyPairGenerator kg = KeyPairGenerator.getInstance("EC");
        ECGenParameterSpec kpgparams = new ECGenParameterSpec("secp256r1");
        kg.initialize(kpgparams);

        KeyPair kp = kg.generateKeyPair();
        PublicKey pubKey = kp.getPublic();
        PrivateKey pvtKey = kp.getPrivate();

        // sign
        Signature ecdsaSign = Signature.getInstance("SHA256withECDSA");
        ecdsaSign.initSign(pvtKey);
        String message = "text ecdsa with sha256";//getSHA256(msg)
        ecdsaSign.update(message.getBytes(StandardCharsets.UTF_8), 0, message.length());
        byte[] signature = ecdsaSign.sign();

        // Validation
        ecdsaSign.initVerify(pubKey);
        ecdsaSign.update(message.getBytes(StandardCharsets.UTF_8), 0, message.length());
        boolean result = ecdsaSign.verify(signature);

        assertTrue(result); // junit5 assert
    } catch (Exception e) {
         e.printStackTrace();
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25261823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档