如何在Bouncy Castle中实现OpenSSL的EC_POINT_set_compressed_coordinates_GFp?

问题描述 投票:0回答:1

我需要一点帮助在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个回答
2
投票

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

在Weierstrass方程(GFp)

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

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

ec_GFp_simple_set_compressed_coordinates(OpenSSL-1.0.1e)中的ecp_oct.c为例,这就是它的作用:

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