0

我有一条椭圆曲线 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) 的点是否在曲线上。我怎样才能找到它?

4

2 回答 2

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 坐标的生成器 (x,y)。至于如何首先找到发电机,那就是另一回事了。

于 2013-02-06T08:05:09.617 回答
0

而不是 using EC_POINT_set_affine_coordinates_GFp,它需要xy,而 use EC_POINT_set_compressed_coordinates_GFp,而不是 a ,它y表示y_bit两个y值(偶数或奇数)中的哪一个用于给定x(如果x在曲线的域内)。

然后你应该能够遍历前几个x以找到最小的坐标x,就像你试图做的那样。

于 2013-01-01T20:38:22.177 回答