ECDH BouncyCastle KeyAgreement 长度

信息安全 。网 diffie-hellman 电子抄送
2021-09-02 17:41:09

我试图在 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”,而我尝试的每个其他前缀都抛出了异常。

任何提示将不胜感激!

1个回答

椭圆曲线是二维空间中的一个点,因此它有两个坐标(通常称为XY),它们是某个字段中的值。在 P-192 的情况下,该字段由整数模组成,长度为 192 位的素数pp位于 2 191和 2 192之间)。曲线点是满足曲线方程的 ( X , Y ) 对 ( Y 2 = X 3 + aX + b对于两个常数ab定义曲线)。碰巧曲线上的点数(曲线“阶数”)是一个整数n,其值也接近(但略低于)2 192选择特定曲线(常数ab)以使n为素数。

一个私人DH密钥是一个整数模ñ因此,它总是可以编码为 192 位(24 字节),因为n本身是一个 192 位整数。

公开 DH 密钥是一个点;这是双方发送给对方的内容。对于私钥u,对应的公钥是点uG(常规曲线点G的乘积,它是曲线定义的一部分)。

UV两方进行 ECDH 时,他们使用(或随机生成)他们的私钥uv,并将相应的公钥uGvG发送给对方。得到的共享秘密就是他们都可以计算的点uvG(但窃听者无法计算,这是 ECDH 的点)。

恰巧,ECDH被定义ANSI X9.63标准和标准说,实际的共享密钥是不完整的点UVG,但只有X坐标点的UVG该坐标是我们正在工作的领域的一个元素,即整数模p因此,它可以被编码超过 192 位,这就是为什么你只得到 24 个字节的原因。请注意,该值是一个整数模p(字段模数),而私钥是模数n(曲线顺序);pn是不同的(但都是 P-192 曲线中的 192 位值)。


您可能会问,ECDH 是如何定义的。原因主要是点坐标是多余的:由于点 ( X , Y ) 必须满足曲线方程,因此仅从X就可以计算X 3 + aX + b = Y 2,从而得到Y坐标的平方在一个字段中,一个给定的值最多可以有两个平方根,所以如果你有X坐标,那么你可以恢复Y和 - Y,即几乎完整的点。从这个意义上说,使用X坐标,您几乎可以拥有 ECDH 所期望的所有保密性。

(这意味着当双方仅向对方发送他们各自的公钥uGvGX坐标时,ECDH 仍然是可能的,前提是他们都重新计算了丢失的Y。但并非所有实现都支持这一点,因为它涉及一些平方根的额外代码,并且对该主题可能的专利存在一些不确定性。总的来说,这称为点压缩。)