AsymmetricKeyParameter как byte[]

Я пытаюсь выполнить обмен ключами ECDH с помощью С# BouncyCastle. Мне удалось создать необходимые объекты AsymmetricCipherKeyPair, и я также могу сгенерировать общий ключ открытого ключа других сторон.

Однако для фактического обмена открытым ключом мне нужен byte[] или, по крайней мере, что-то, что я могу превратить в необработанные данные, поскольку протокол, который я использую для передачи ключей между сторонами, не будет принимать никаких объектов 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[].

Надеюсь, вы понимаете, к чему я клоню, и сможете мне помочь.


person H. Jan    schedule 12.10.2015    source источник


Ответы (1)


Если у вас есть только ECPublicKeyParameter 'pub' (т.е. из keyPair.Public), вы можете получить общедоступную кодировку точек:

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

На принимающей стороне:

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

Более типично обмениваться сертификатами, иначе у вас не будет уверенности в том, с кем вы «договариваетесь».

Я немного обеспокоен тем, что вы можете «развернуть свой собственный криптопротокол»; если это для реального приложения, рассмотрите возможность использования существующего протокола, возможно, просто TLS.

person Peter Dettman    schedule 19.10.2015
comment
Спасибо за ваш ответ. Не волнуйтесь, часть сертификата находится в процессе, это был только первый шаг, чтобы попробовать некоторые обмены ключами. Аутентификация находится в стадии разработки, спасибо за подсказку. - person H. Jan; 20.10.2015