使用Bouncy Castle生成用于DH密钥交换的64字节公钥

时间:2015-11-10 23:30:21

标签: c# .net diffie-hellman

我需要使用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生成密钥对。

1 个答案:

答案 0 :(得分:1)

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

有关讨论,请参阅here