openssl椭圆曲线

时间:2012-12-08 18:54:49

标签: c++ cryptography openssl elliptic-curve

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

2 个答案:

答案 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,而不是使用yy_bit。表示给定y使用的两个x值(偶数或奇数)中的哪一个(如果x在曲线的域内)。

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