首页 > 解决方案 > 无法将 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)));

标签: javacryptographybouncycastleencryption-asymmetricecdsa

解决方案


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);

推荐阅读