为了账号安全,请及时绑定邮箱和手机立即绑定

BouncyCastle 如何生成 ECDH“密钥”?

BouncyCastle 如何生成 ECDH“密钥”?

月关宝盒 2023-02-16 16:03:09
我有一个使用 BouncyCastle 作为安全提供程序的应用程序,但我想切换到另一个直接使用 OpenSSL (Conscrypt) 的应用程序。我遇到的问题是我使用的是 BouncyCastle 提供的 KeyGenerator 中的 ECDH“密钥”,但我的其他库中没有类似的 KeyGenerator。为了比较两者,我将使用两种方法和以下输入来解码这些点 -添加换行符以提高可读性BADX_GAXp03z_5p05O1-op61KJAl4j9U2sBnAnJ4p_6GSAIyFGU3lMoC4aIXw_2qlTnplykArgjvwCWw-2g6L44使用 BouncyCastle 方法-public org.bouncycastle.jce.interfaces.ECPublicKey loadECPublicKeyBC(String encodedPublicKey) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException, IOException {    Base64.Decoder base64Decoder = Base64.getUrlDecoder();    byte[] decodedPublicKey = base64Decoder.decode(encodedPublicKey);    KeyFactory keyFactory = KeyFactory.getInstance("ECDH", "BC");    ECParameterSpec ecParameterSpec = ECUtil.getECParameterSpec(openSSLProvider, "prime256v1");    ECPoint ecPoint = ECUtil.decodePoint(decodedPublicKey, ecParameterSpec.getCurve());    ECPublicKeySpec pubSpec = new ECPublicKeySpec(ecPoint, ecParameterSpec);    org.bouncycastle.jce.interfaces.ECPublicKey ecPublicKey = (org.bouncycastle.jce.interfaces.ECPublicKey)keyFactory.generatePublic(pubSpec);    return ecPublicKey;}返回getAlgorithm的是EC。返回getFormat的是X.509。getEncoded这个的价值是——[48,-126,1,51,48,-127,-20,6,7,42,-122,72,-50,61,2,1,48,-127,-32,2,1,1,48,44,6,7,42,-122,72,-50,61,1,1,2,33,0,-1,-1,-1,-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,48,68,4,32,-1,-1,-1,-1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-4,4,32,90,-58,53,-40,-86,58,-109,-25,-77,-21,-67,85,118,-104,-122,-68,101,29,6,-80,-52,83,-80,-10,59,-50,60,62,39,-46,96,75,4,65,4,107,23,-47,-14,-31,44,66,71,-8,-68,-26,-27,99,-92,64,-14,119,3,125,-127,45,-21,51,-96,-12,-95,57,69,-40,-104,-62,-106,79,-29,66,-30,-2,26,127,-101,
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

这两个公钥表示本质上是等价的。两者都是RFC 5280中描述的 DER 编码的 SubjectPublicKeyInfo 结构的实例。该结构不仅包含公钥,还包含一些描述公钥算法上下文的元数据。对于其中一种形式,元数据仅声明上下文是“prime256v1”曲线。另一方面,提供了该曲线的所有参数。公钥本身作为两种形式的最后一部分出现,如您所见,它们是相同的。

您拥有的是同一公钥的 3 种不同表示形式。base-64 编码字符串只包含一个类型 4(未压缩)椭圆曲线点,根据SEC 1第 2.3.3 节进行编码。您在类中找到了一个未记录且不受支持的 APIsun.security.util.ECUtil来将其转换为 PublicKey。

我不完全确定你的问题是关于私钥的。对于包括 ECDH 在内的 DH 方案,私钥只是从基础组订单范围中“安全地”选择的一个整数。然后通过将这个整数乘以曲线的基点(在椭圆曲线意义上)来计算公钥。结果公钥也是曲线上的一个点。


查看完整回答
反对 回复 2023-02-16
  • 1 回答
  • 0 关注
  • 210 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信