AsymmetricKeyParameter 作为 byte[]

AsymmetricKeyParameter as byte[]

我正在尝试使用 C# BouncyCastle 进行 ECDH 密钥交换。 我已经成功地创建了必要的 AsymmetricCipherKeyPair 对象,而且我还能够生成其他方的共享密钥 public key.

但是,要实际交换 public 密钥,我需要它作为字节 [] 或至少任何我可以转换为原始数据的东西,因为我使用的协议在派对不会拿走任何 BouncyCastle 对象。

   X9ECParameters ecPars = NistNamedCurves.GetByName("P-521");
  ECDomainParameters ecDomPars = new ECDomainParameters(ecPars.Curve, ecPars.G, ecPars.N, ecPars.H, ecPars.GetSeed());
  IAsymmetricCipherKeyPairGenerator gen = GeneratorUtilities.GetKeyPairGenerator("ECDH");
  gen.Init(new ECKeyGenerationParameters(ecDomPars, new SecureRandom()));

  AsymmetricCipherKeyPair keyPair = gen.GenerateKeyPair();
  IBasicAgreement keyAgreement = AgreementUtilities.GetBasicAgreement("ECDH");
  keyAgreement.Init(keyPair.Private);

所以我在这里需要的是 keyPair.Public 作为 byte[] 的键值。

我希望你明白我的方向并能帮助我。

如果你只有一个ECPublicKeyParameter'pub'(即来自keyPair.Public),你可以获得public点编码:

byte[] data = pub.Q.GetEncoded();

接收端:

ECCurve curve = ecDomPars.Curve;
ECPoint q = curve.DecodePoint(data);
ECPublicKeyParameter peerPub = new ECPublicKeyParameter(q, ecDomPars);

更常见的是交换证书,否则你无法确定你"agreeing"和谁在一起。

我有点担心你可能 "rolling your own crypto protocol";如果这是一个真正的应用程序,请考虑使用现有的协议,也许只是 TLS。