猿问

BouncyCastle 如何生成 ECDH“密钥”?

我有一个使用 BouncyCastle 作为安全提供程序的应用程序,但我想切换到另一个直接使用 OpenSSL (Conscrypt) 的应用程序。我遇到的问题是我使用的是 BouncyCastle 提供的 KeyGenerator 中的 ECDH“密钥”,但我的其他库中没有类似的 KeyGenerator。


为了比较两者,我将使用两种方法和以下输入来解码这些点 -


添加换行符以提高可读性


BADX_GAXp03z_5p05O1-op61KJAl4j9U2sBnAnJ4p_6GSAIyFGU3lM

oC4aIXw_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,


月关宝盒
浏览 211回答 1
1回答

浮云间

这两个公钥表示本质上是等价的。两者都是RFC 5280中描述的 DER 编码的 SubjectPublicKeyInfo 结构的实例。该结构不仅包含公钥,还包含一些描述公钥算法上下文的元数据。对于其中一种形式,元数据仅声明上下文是“prime256v1”曲线。另一方面,提供了该曲线的所有参数。公钥本身作为两种形式的最后一部分出现,如您所见,它们是相同的。您拥有的是同一公钥的 3 种不同表示形式。base-64 编码字符串只包含一个类型 4(未压缩)椭圆曲线点,根据SEC 1第 2.3.3 节进行编码。您在类中找到了一个未记录且不受支持的 APIsun.security.util.ECUtil来将其转换为 PublicKey。我不完全确定你的问题是关于私钥的。对于包括 ECDH 在内的 DH 方案,私钥只是从基础组订单范围中“安全地”选择的一个整数。然后通过将这个整数乘以曲线的基点(在椭圆曲线意义上)来计算公钥。结果公钥也是曲线上的一个点。
随时随地看视频慕课网APP

相关分类

Java
我要回答