【发布时间】: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