如何从 AsymmetricKeyParameter 创建 java.security.PublicKey

问题描述

您好,我正在尝试将公钥写入 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 对象相对容易。

为此可以应用 BouncyCastle 的 EC5Util 类,该类处理从 ECDomainParametersECParameterSpec 以及从 BouncyCastle 的 ECPoint 到 Java 的 ECPoint 的转换。

然后可以像以前一样使用 PublicKey 作为 X.509/SPKI PEM 编码的公钥导出 JcaPEMWriter 对象:

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...