如何从 AsymmetryKeyParameter 创建 java.security.PublicKey

问题描述 投票:0回答:2

您好,我正在尝试将公钥写入 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

bouncycastle ecdsa
2个回答
0
投票

看起来

JcaPEMWriter
不能直接处理
AsymmetricKeyParameter
对象。但将
AsymmetricKeyParameter
对象转换为
PublicKey
对象相对容易。

对于这个 BouncyCastle 的

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
...

0
投票

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
实例,正如预期的那样。

© www.soinside.com 2019 - 2024. All rights reserved.