我有一条椭圆曲线EC,我需要找到这样一个EC的点G,它的坐标是曲线上所有点的最小非负整数。我需要它来实现ECOH哈希算法。 我试图使用openssl来实现这个目标,但到目前为止我还没弄清楚如何找到这样的观点。我试图这样做:
EC_POINT *G = EC_POINT_new(ec);
for(int i = 1; i < 1024; i++)
{
itoa(i, str, 10);
BN_dec2bn(&x, str);
EC_POINT_set_affine_coordinates_GFp(ec, G, x, y, ctx);
if(EC_POINT_is_on_curve(ec, G, ctx))
printf("%s\n", str);
}
但它只检查坐标为(x,y)的点是否在曲线上。 我怎么能找到它?
答案 0 :(得分:3)
首先,如果ec
未提供生成器,请找到生成器。我想你想要具有最小x坐标的发生器。你可以这样做:
// Suppose you've found a generator point G, and a BIGNUM context bn_ctx
// has been created and initialized
BIGNUM x, y, x_min, y_min;
BN_init(&x); BN_init(&x_min);
BN_init(&y); BN_init(&y_min);
EC_POINT *P = EC_POINT_new(ec);
EC_POINT_copy(P,G);
EC_POINT_get_affine_coordinates_GFp(ec,P,x_min,y_min,bn_ctx);
do{
EC_POINT_add(ec,P,P,G,bn_ctx);
EC_POINT_get_affine_coordinates_GFp(ec,P,x,y,bn_ctx);
if (x < x_min) {
BN_copy(x_min, x);
BN_copy(y_min, y);
}
}while(!EC_POINT_is_at_infinity(ec,P));
然后你的生成器(x,y)具有最小的x坐标。 至于如何首先找到发电机,这是另一个故事。
答案 1 :(得分:0)
使用EC_POINT_set_affine_coordinates_GFp
代替x
代替y
取代EC_POINT_set_compressed_coordinates_GFp
,而不是使用y
和y_bit
。表示给定y
使用的两个x
值(偶数或奇数)中的哪一个(如果x
在曲线的域内)。
然后你应该能够遍历前几个x
来找到最小x
的坐标,正如你试图做的那样。