我有一个使用 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 方案,私钥只是从基础组订单范围中“安全地”选择的一个整数。然后通过将这个整数乘以曲线的基点(在椭圆曲线意义上)来计算公钥。结果公钥也是曲线上的一个点。
添加回答
举报
0/150
提交
取消