Как получить общий секрет с BouncyCastle с двумя ключами? - PullRequest
0 голосов
/ 24 мая 2019

Требуется общий секретный ключ между данным 64-байтовым открытым ключом (их) и 32-байтовым закрытым ключом (нашим).

У меня есть ключи, которые создаются сторонним поставщиком (код ECC P-256),Открытые ключи - 64 байта, а закрытые ключи - 32 байта.

Я не могу понять, как заставить BouncyCastle импортировать эти ключи.Кажется, он ожидает ключи с кодировкой DER, но это не то, с чем мне приходится работать.

public static byte[] GetSharedSecret(byte[] their_public, byte[] our_private)
{
  // their_public: 64 byte public key
  // our_private: 32 byte private key
  var pri = PrivateKeyFactory.CreateKey(our_private); // this fails
  var pub = PublicKeyFactory.CreateKey(their_public); // this fails

  // Expected to produce a 32 byte shared secret:
  return ??SomeBouncyCastleCode??.GetSharedSecret();
}

Я ожидаю, что код шифрования / ключа работает с 32- и 64-байтовыми массивами для ключей.При работе со встроенными устройствами и другими областями, где кодовое пространство ограничено, невозможно иметь дело с закодированными ключами / ключами DER / xyz.Они сокращены до фактических значений ключа, и это все, с чем мне нужно работать.

Я не могу понять, как заставить это работать с BouncyCastle.

1 Ответ

0 голосов
/ 24 мая 2019

AgreementUtilities.GetBasicAgreement возвращает IBasicAgreement, который вы можете Init с закрытым ключом и CalculateAgreement с открытым ключом. Результат расчета - BigInteger.

Для разбора ключей вы можете использовать Curve.DecodePoint.

Вот пример:

var ecP = ECNamedCurveTable.GetByName("curveNameHere");
var ecSpec = new ECDomainParameters(ecP.Curve, ecP.G, ecP.N, ecP.H, ecP.GetSeed());
var publicKey = new ECPublicKeyParameters(ecSpec.Curve.DecodePoint(YourByteArray), ecSpec);

IBasicAgreement agreement = AgreementUtilities.GetBasicAgreement("nameHere");
agreement.Init(privateKey);
BigInteger result = agreement.CalculateAgreement(publicKey);
return result.ToByteArrayUnsigned();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...