您好,我正在尝试将公钥写入 PEM 文件。
org.bouncycastle.openssl.jcajce.JcaPEMWriter
似乎是正确的工具,但它使用 org.bouncycastle.openssl.jcajce.JcaMiscPEMGenerator
,它需要作为 java.security.PublicKey
实例的键。
不幸的是,我正在处理的项目的所有其余部分都使用
AsymmetricKeyParameter
作为公钥。我检查了里面有你想从公钥知道的所有内容,包括 G 点和曲线顺序,但它与 java.security.PublicKey
不兼容。
如果我有
JcaPEMWriter
的实例,有没有办法使用 AsymmetricKeyParameter
?顺便说一句,我使用 ECDSA 密钥。
(我一开始对此感到惊讶,因为 BouncyCastle 的
JcaPEMWriter
与他们自己的类不兼容,AsymmetricKeyParameter
)
JcaPEMWriter
不能直接处理 AsymmetricKeyParameter
对象。但将 AsymmetricKeyParameter
对象转换为 PublicKey
对象相对容易。
EC5Util
类,可以应用它处理从 ECDomainParameters
到 ECParameterSpec
以及从 BouncyCastle 的 ECPoint
到 Java 的 ECPoint
的转换。
PublicKey
将 JcaPEMWriter
对象导出为 X.509/SPKI PEM 编码的公钥:
// AsymmetricKeyParameter object containing the public EC key
AsymmetricKeyParameter asymmetricKeyParameter = ...
// Convert AsymmetricKeyParameter object to PublicKey object
ECPublicKeyParameters ecPublicKeyParameters = (ECPublicKeyParameters)asymmetricKeyParameter;
ECParameterSpec ecParameterSpec = EC5Util.convertToSpec(ecPublicKeyParameters.getParameters());
ECPoint ecPoint = EC5Util.convertPoint(ecPublicKeyParameters.getQ());
ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(ecPoint, ecParameterSpec);
PublicKey publicKey = KeyFactory.getInstance("EC").generatePublic(ecPublicKeySpec);
// Export PublicKey object with JcaPEMWriter in X.509/SPKI format, PEM encoded
...
Topaco 提供的答案对我不起作用(可能是因为我正在使用
JSch
),因为它抛出异常(无法将 Ed25519PublicKeyParameters
转换为 ECPublicKeyParameters
)。
在研究了 BC 代码之后,我在
KeyFactorySpi.java
中发现了一行代码,它提示我从现有数据创建 pub 密钥的正确方法:
AsymmetricKeyParameter keyParameter = OpenSSHPublicKeyUtil.parsePublicKey(blob.getData());
OpenSSHPublicKeySpec keySpec = new OpenSSHPublicKeySpec(OpenSSHPublicKeyUtil.encodePublicKey(keyParameter));
PublicKey publicKey = KeyFactory.getInstance("EdDSA").generatePublic(keySpec);
这将返回一个
BCEdDSAPublicKey
实例,正如预期的那样。