【问题标题】:How do I implement OpenSSL's EC_POINT_set_compressed_coordinates_GFp in Bouncy Castle?如何在 Bouncy Castle 中实现 OpenSSL 的 EC_POINT_set_compressed_coordinates_GFp?
【发布时间】:2013-10-31 19:46:16
【问题描述】:

在 C# 或 Java 中移植 OpenSSL 函数 EC_POINT_set_compressed_coordinates_GFp 需要一点帮助 .

虽然我可以使用 Bouncy Castle(首选),但我愿意从头开始构建它。

C++ 方法签名如下所示:

int EC_POINT_set_compressed_coordinates_GFp(const EC_GROUP *group, EC_POINT *p,
   const BIGNUM *x, int y_bit, BN_CTX *ctx);

来自 OpenSSL:

点也可以用它们的压缩坐标来描述。对于一个点 (x, y),对于任何给定的 x 值,使得该点位于曲线上,y 将永远只有两个可能的值。因此,可以使用 EC_POINT_set_compressed_coordinates_GFp 和 EC_POINT_set_compressed_coordinates_GF2m 函数设置一个点,其中 x 是 x 坐标,y_bit 是值 0 或 1,以确定应使用 y 的两个可能值中的哪一个。

任何人都可以协助计算所需的数学吗?我无法理解源代码,并希望确保我正确地移植它

【问题讨论】:

    标签: c# java encryption openssl bouncycastle


    【解决方案1】:

    此函数的目的是使用提供的x 坐标和y_bit 设置一个点P。您可以将 [x-coordinate,y_bit] 视为 (x-coordinate,y-coordinate); 的压缩形式。它们都代表P点。

    在魏尔斯特拉斯方程 (GFp) 中

    y^2 = x^3 + a*x + b,
    

    假设 y 是模数形式 (0 y_bit 是 y 的 LSB。如您所见,y 是 x^3 + a*x + b 的平方根之一。并且可以证明每个根都有不同的y_bit。这就是为什么您可以使用 y_bit 来确定应该使用哪个 y(根)。

    ecp_oct.c(OpenSSL-1.0.1e) 中的ec_GFp_simple_set_compressed_coordinates 为例,它的作用如下:

    • 计算 x^3 + a*x + b
    • 计算 y,x^3 + a*x + b 的平方根
    • 将 y_bit 与 y 的 LSB 进行比较。如果不同,y = -y (mod p)
    • 将仿射坐标 (x,y) 设置为点 P

    【讨论】:

    • 谢谢!我希望有人(或者我会)在 C# 或 Java 中发布 Bouncy Castle 源代码
    • 您能否详细说明,或者为步骤 2 和 3 提供一些代码/伪代码。在这些步骤中,您应该是原始形式还是模形式?
    猜你喜欢
    • 1970-01-01
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多