gpt4 book ai didi

java - 将字节数组转换为公钥 ECDSA

转载 作者:行者123 更新时间:2023-11-30 08:11:33 28 4
gpt4 key购买 nike

我需要使用 ECDSA 算法对消息进行签名并在 java 中发送给接收者。然后,接收方应验证发送方的签名。

因此,为此,接收方拥有发送方的公钥,但在通过以下命令将 java.security.PublicKey 转换为字节数组后,其格式为字节数组:

byte[] byteArrayPublicKey = publickey.getEncoded();

ECDSA算法中公钥的格式(未转换为字节数组)如下:

公钥:

X: 8a83c389e7bb817c17bf2db4ed71055f18342b630221b2a3a1ca752502dc2e21

Y: 3eaf48c9ab1700fe0966a0cde196b85af66bb8f0bacef711c9dca2368f9d8470

但是,问题在于将此字节数组转换为可用格式,以验证接收方的 java.security.PublicKey 签名。

一般来说,有没有什么方案可以不用转字节数组就可以验证签名呢?换句话说,问题是使用任何方法通过发送者的公钥验证签名。

最佳答案

But, the problem is to convert this byte array to usable format to verify the signature that is java.security.PublicKey by receiver.

你可以这样解决问题:

public static ECPublicKey genEcPubKey() throws Exception {
KeyFactory factory = KeyFactory.getInstance("ECDSA", "BC");
java.security.PublicKey ecPublicKey = (ECPublicKey) factory
.generatePublic(new X509EncodedKeySpec(Helper
.toByte(ecRemotePubKey))); // Helper.toByte(ecRemotePubKey)) is java.security.PublicKey#getEncoded()
return (ECPublicKey) ecPublicKey;
}

请注意,您需要 BouncyCastle提供者来做到这一点。

但问题仍然存在,您如何生成私钥?

public KeyPair ecKeyPairGenerator(String curveName) throws Exception {
KeyPair keyPair;
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(
"ECDSA", "BC");
ECGenParameterSpec ecGenParameterSpec = new ECGenParameterSpec(
curveName);
keyPairGenerator.initialize(ecGenParameterSpec, new SecureRandom());
keyPair = keyPairGenerator.generateKeyPair();
java.security.PublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();
System.out.println("JAVA EC PublicKey: "
+ Helper.toHex(ecPublicKey.getEncoded()));

// write private key into a file. Just for testing purpose
FileOutputStream fileOutputStream = new FileOutputStream(
"ECPrivateKey.key");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
fileOutputStream);
objectOutputStream.writeObject(keyPair.getPrivate());
objectOutputStream.close();
return keyPair;
}

我在 github 中有完整的 EC 签名/验证运行代码.您可以看一下以更好地理解。

关于java - 将字节数组转换为公钥 ECDSA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30945722/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com