我需要使用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生成密钥对。
答案 0 :(得分:1)
我认为数据是由pubKeyInfo.PublicKeyData.GetBytes()
提供的。它的长度为65个字节,因为它有一个前缀0x04
字节,表示剩余的64个字节以未压缩格式描述公钥(而0x02
表示压缩格式。)
有关讨论,请参阅here。