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

2024-05-18

我正在尝试使用带有 secp256r1 曲线 (P256) 的 ECDSA 和用于消息哈希的 SHA256 算法生成签名。我也在使用 Bouncy Castle 库。 下面的代码,

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

    }

}

这里的密钥对是使用 Key Pair 生成的,但根据我的要求,我将拥有静态私钥和公钥。此外,签名验证始终返回 false。

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


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

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

验证签名:通过same数据到验证Signature.update()当你传递到签名处时Signature.update(). Exactly相同,逐字节。传递签名值only to Signature.verify()。推杆PrivateKey.toString()数据中的内容很愚蠢;这个值是特定于正在运行的Java进程的,所以你必须将它发送到接收进程(如果不同,通常应该是这样),在那里它是无用的并且浪费空间。

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

  • use java.security.KeyStore.getInstance("JKS")创建一个 store 对象并传递.load(InputStream,char[]) a FileInputStream上的文件和密码。

  • use .getKey(String alias,char[] password)并强制转换以获得 PrivateKey。用于签名。

  • use .getCertificateChain(String alias)[0].getPublicKey()从第一个(唯一的)证书获取公钥。用于验证。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 secp256r1 曲线和 SHA256 算法生成 ECDSA 签名 - BouncyCastle 的相关文章

随机推荐