我需要使用ECDSA算法对消息进行签名并发送给Java中的接收者。然后,接收方应验证发送方的签名。
因此,为此,接收方具有发送方的公钥,但是在java.security.PublicKey
通过以下命令将其转换为字节数组后,该字节为字节数组格式:
byte[] byteArrayPublicKey = publickey.getEncoded();
ECDSA算法中的公钥格式(将其转换为字节数组之前)如下:
公钥:
X: 8a83c389e7bb817c17bf2db4ed71055f18342b630221b2a3a1ca752502dc2e21
Y: 3eaf48c9ab1700fe0966a0cde196b85af66bb8f0bacef711c9dca2368f9d8470
但是,问题是将此字节数组转换为可用格式以验证java.security.PublicKey
接收方签名。
通常,是否有解决方案可以在不将签名转换为字节数组的情况下对其进行验证?换句话说,问题是使用任何方法通过发件人的公钥来验证签名。
但是,问题是将此字节数组转换为可用格式,以通过接收方验证java.security.PublicKey的签名。
您可以这样解决问题:
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签署/验证代码。您可以看一下以获得更好的理解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句