java - 无法将 ECPublicKeyImpl 转换为 BCECPublicKey
问题描述
我想获得一个压缩的 EC 公钥表示,我通过遵循这个答案来做到这一点。但是当我尝试将 ajava.security.PublicKey
转换为 a时,org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey
我得到了一个例外:
jdk.crypto.ec/sun.security.ec.ECPublicKeyImpl cannot be cast to org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey
进口:
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.math.ec.ECPoint;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.spec.ECGenParameterSpec;
代码:
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC");
ECGenParameterSpec ecSpec = new ECGenParameterSpec("secp256k1");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
keyGen.initialize(ecSpec, random);
KeyPair pair = keyGen.generateKeyPair();
ECPoint ecPoint = ((BCECPublicKey) pair.getPublic()).getQ(); - Exception
System.out.println(new String(ecPoint.getEncoded(true)));
解决方案
KeyPairGenerator.getInstance(String)
让您成为第一个实现给定算法的安全提供商。无需进一步配置,它就是"SunEC"。
由于您显然希望依靠BouncyCastle生成密钥,因此请使用 2 参数工厂方法:
final KeyPairGenerator keyGen = KeyPairGenerator.getInstance("EC", BouncyCastleProvider.PROVIDER_NAME);
但是,如果您要接收KeyPair
对象作为参数,则不能假定它来自 BouncyCastle,您应该手动将其转换为 a BCECPublicKey
,如 Topaco 的评论中所示:
final BCECPublicKey pubKey = pair.getPublic() instanceof BCECPublicKey
? (BCECPublicKey) pair.getPublic()
: new BCECPublicKey((ECPublicKey) pair.getPublic(), BouncyCastleProvider.CONFIGURATION);
推荐阅读
- c# - Exchange2010_SP2 版本的 Exchange api 过滤问题
- api - 如何首次将与会者添加到日历活动?
- jena - 为什么 Jena fuseki 对猫头鹰的推理没有反应?
- google-apps-script - 从子文件夹(在 Google Drive 上)获取特定文件(Google Sheet),然后更改单元格的值
- postgresql - 是否可以在“创建物化视图为”形式的物化视图上创建新索引?
- reactjs - 迭代和 Typescript 优化
- c# - .NET 是在新的不同线程池线程上恢复等待继续,还是重用以前恢复的线程?
- ios - SwiftUI 访问在 ForEach 循环中创建的视图
- android - 在 MAC Catalina 中更新 SDK 管理器时 Flutter 安装出错
- angular - 无法为“text/html”的范围错误内容类型注册/更新 ServiceWorker