我试图在 C# 中使用 BouncyCastle 的 ECDH 方法获取共享密钥,但是我收到的共享密钥比我预期的 48 字节短得多。
我有一个受信任的外部源为我(A 面)提供了一个公钥和一个私钥,它们是为 P192 生成的,公共长度为 48,私人长度为 24。
另外,我收到了 B 方用来计算协议的公钥。
我期望共享密钥的长度为 48,但最终长度为 24。
string P192publicA = ""; // 48 length key
string P192privateA = ""; // 24 length key
string P192publicB = ""; // 48 length key
DerObjectIdentifier p192Der = Org.BouncyCastle.Asn1.Sec.SecObjectIdentifiers.SecP192r1;
ECKeyGenerationParameters ecparams = new ECKeyGenerationParameters(p192Der, new SecureRandom());
ECCurve curveP192 = ecparams.DomainParameters.Curve;
ECPrivateKeyParameters ecPrivateA = new ECPrivateKeyParameters("ECDSA", new BigInteger(P192privateA, 16), p192Der);
ECPublicKeyParameters ecPublicA = new ECPublicKeyParameters("ECDSA", curveP192.DecodePoint(Hex.Decode("04" + P192publicA)), p192Der);
ECPublicKeyParameters ecPublicB = new ECPublicKeyParameters("ECDSA", curveP192.DecodePoint(Hex.Decode("04" + P192publicB)), p192Der);
IBasicAgreement aKeyAgreeBasic = AgreementUtilities.GetBasicAgreement("ECDHC");
aKeyAgreeBasic.Init(ecPrivateA);
BigInteger k = aKeyAgreeBasic.CalculateAgreement(ecPublicB);
我的十六进制结果只有 24 长度,而我预计为 48。
我对密钥协议机制的理解有问题吗?我不确定点的解码,我在有弹性的示例中看到他们在解码点之前添加了“04”,而我尝试的每个其他前缀都抛出了异常。
任何提示将不胜感激!