我需要一点帮助在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的两个可能值中的哪一个。
有人可以协助数学吗?我无法理解来源,并希望确保将其正确移植
答案 0 :(得分:2)
此功能的目的是使用提供的P
坐标和x
设置点y_bit
。您可以将[x坐标,y_bit]看作(x坐标,y坐标)的压缩形式;它们都代表点P.
在Weierstrass方程(GFp)
y^2 = x^3 + a*x + b,
假设y是其模数形式(0 <= y
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
为例,这就是它的作用: