首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用FIPS BouncyCastle将ECPrivateKey转换为ECPublicKey?

如何使用FIPS BouncyCastle将ECPrivateKey转换为ECPublicKey?
EN

Stack Overflow用户
提问于 2018-08-27 09:18:07
回答 1查看 271关注 0票数 2

如何使用FIPS BouncyCastle将ECPrivateKey转换为ECPublicKey?

我使用以下代码(稍微简化)将ECPrivateKey转换为ECPublicKey:

代码语言:javascript
运行
复制
public static ECPublicKey getPublicKeyFromPrivateKey(ECPrivateKey privateKey) throws GeneralSecurityException {
    final KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    final BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey;
    final ECParameterSpec ecSpec = bcecPrivateKey.getParameters();
    final ECPoint q = ecSpec.getG().multiply(bcecPrivateKey.getD());
    final byte[] qBytes = q.getEncoded(false);
    final ECPoint point = ecSpec.getCurve().decodePoint(qBytes);
    final ECPublicKeySpec pubSpec = new ECPublicKeySpec(point, ecSpec);
    return (ECPublicKey) keyFactory.generatePublic(pubSpec);
}

这与非FIPS BouncyCastle一起工作得很好。现在,我们需要以符合FIPS的方式做同样的事情。这里的问题是,在FIPS BouncyCastle 1.0.1中似乎不存在像ECParameterSpec这样的类。我们如何使用FIPS BouncyCastle做同样的事情?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-24 06:48:40

我找到了以下对我有效的解决方案:

代码语言:javascript
运行
复制
public static PublicKey getPublicKeyForPrivateKeyEC(ECPrivateKey privateKey) throws GeneralSecurityException {
    final KeyFactory keyFactory = KeyFactory.getInstance("ECDSA", new BouncyCastleProvider());
    final ECParameterSpec ecSpec = privateKey.getParams();
    final ECCurve ecCurve = FipsECUtil.convertCurve(ecSpec);
    final ECMultiplier multiplier = ecCurve.getMultiplier();
    final ECPoint generatorP = FipsECUtil.convertPoint(ecSpec, ecSpec.getGenerator());
    final ECPoint q = multiplier.multiply(generatorP, privateKey.getS());
    final byte[] publicDerBytes = q.getEncoded(false);
    final ECPoint point = ecCurve.decodePoint(publicDerBytes);
    final ECPublicKeySpec pubSpec = new ECPublicKeySpec(new java.security.spec.ECPoint(
        point.getAffineXCoord().toBigInteger(), 
        point.getAffineYCoord().toBigInteger()), ecSpec);
    return keyFactory.generatePublic(pubSpec);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52031491

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档