0

在 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 的两个可能值中的哪一个。

任何人都可以协助计算所需的数学吗?我在理解源代码时遇到了麻烦,我想确保我正确地移植了它

4

1 回答 1

2

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

在 Weierstrass 方程 (GFp) 中

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

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

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

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