【问题标题】:Generating 64-byte public key for DH key exchange using Bouncy Castle使用 Bouncy Castle 为 DH 密钥交换生成 64 字节公钥
【发布时间】:2016-02-12 01:05:18
【问题描述】:

我需要使用 C# 中的 Bouncy Castle 使用 secp256r1 曲线为 Diffie-Hellman 密钥交换生成密钥对。公钥应该是 64 字节(我不确定这是哪种格式(压缩?),但我可以找到)。

我有以下代码,但缺少 Bouncy Castle 文档让我迷失了方向。

X9ECParameters ecParams = SecNamedCurves.GetByName("secp256r1");
var spec = new ECDomainParameters(ecParams.Curve, ecParams.G, ecParams.N, ecParams.H, ecParams.GetSeed());
var keyGenParams = new ECKeyGenerationParameters(spec, new SecureRandom());

var keyGen = new ECKeyPairGenerator("ECDH");
keyGen.Init(keyGenParams);
AsymmetricCipherKeyPair keyPair = keyGen.GenerateKeyPair();
var pubKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(keyPair.Public);

// pubKeyInfo.GetDerEncoded()
// pubKeyInfo.GetEncoded()
// pubKeyInfo.PublicKey
// pubKeyInfo.ToAsn1Object()

从这里,我可以访问许多不同的导出格式(如上所示),但大多数值最终都是 335 字节长。 pubKeyInfo.PublicKeyData.GetBytes() 给出 65 个字节,但我不知道为什么。

我在这里一定有一些基本的误解。我错过了什么?

如果有帮助,另一个客户端使用uECC_make_key function 生成密钥对。

【问题讨论】:

    标签: c# .net diffie-hellman


    【解决方案1】:

    我相信数据是由pubKeyInfo.PublicKeyData.GetBytes() 提供的。它有 65 个字节长,因为它有一个前缀 0x04 字节,表示剩余的 64 个字节以未压缩格式描述公钥(而0x02 表示压缩格式)。

    请参阅here 进行讨论。

    【讨论】:

    • 这应该被标记为正确答案。从链接来看,相关信息是“SEC定义了三种类型:0x00 =指向无穷大,0x02和0x03 =压缩,0x04 =未压缩”该前缀定义了公钥格式。
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 1970-01-01
    • 2019-03-16
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2017-09-18
    相关资源
    最近更新 更多