【问题标题】:How to get shared secret with BouncyCastle given two keys?如何在给定两个密钥的情况下与 BouncyCastle 共享秘密?
【发布时间】:2019-05-24 19:17:00
【问题描述】:

需要在给定的 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 一起使用。

【问题讨论】:

  • 您的密钥是字节数组,因此是实际 ECC 参数的编码形式。我们只能猜测那个编码是什么。我的猜测是:公钥是两个 32 字节大端整数的编码,表示点的 (x,y) 坐标,私钥是另一个大端整数。
  • @JamesKPolk - 我不知道这是否有帮助,但如果我使用 BCRYPT_ECDH_PUBLIC_P256_MAGIC = 0x314B4345 手动对密钥进​​行编码,我可以将其作为有效(且可用)的 CngKey (CngKeyBlobFormat .EccPublicBlob)。虽然,这并不能解决我的问题,因为我需要可移植的 Bouncy Castle 解决方案。

标签: c# bouncycastle


【解决方案1】:

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

【讨论】:

  • 这个答案的问题在于它假设privateKey 是一个 CipherParameters 对象,但 OP 的私钥只有 32 个字节。所以这对他不起作用。
  • @SGKoishi 对 BouncyCastle 命名空间的详尽搜索不会产生任何名为 ECNamedCurveTable 的方法/类,也不会产生您列出的其他方法/类。我在任何地方都找不到这些(除了 AgreementUtilities - 我可以访问)。我正在使用 NuGet 包 Portable.BouncyCastle-Signed,我们需要它来定位移动设备和其他物联网设备。
  • @ts90 你是对的。我使用的是默认版本的 BouncyCastle,它有Org.BouncyCastle.Asn1.X9.ECNamedCurveTable (src) 和其他方法。您可能会从这个版本中找到一些有用的代码,但我不确定是否有更好的方法来做到这一点。
猜你喜欢
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 2015-02-01
  • 2010-12-28
  • 2019-06-24
相关资源
最近更新 更多