无法将 ECPublicKeyImpl 转换为 BCECPublicKey

问题描述

我想获得一个压缩的 EC 公钥表示,我按照 this 的回答来做到这一点。 但是当我尝试将 java.security.PublicKey 转换为 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,您应该像 Topaco 的评论一样手动将其转换为 BCECPublicKey

final BCECPublicKey pubKey = pair.getPublic() instanceof BCECPublicKey
  ? (BCECPublicKey) pair.getPublic()
  : new BCECPublicKey((ECPublicKey) pair.getPublic(),BouncyCastleProvider.CONFIGURATION);

相关问答

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