给定两个密钥,如何与BouncyCastle共享秘密?

时间:2019-05-24 19:17:00

标签: c# bouncycastle

需要在给定的64字节公共密钥(它们)和32字节私有密钥(我们)之间共享秘密。

我有由外部提供商提供的密钥(P-256 ECC代码)。公钥为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 :(得分:0)

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();