需要在给定的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一起使用。
答案 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();