怎样才能最好地检查这些椭圆曲线参数是否有效



(只是一点上下文:)我是密码学的新手,但是对于一个学校项目,我想创建一个64位ECC曲线的概念证明。(是的,我知道64位密钥不是很安全!)然而,恐怕没有64位的SEC标准参数,只有160-512bit。

所以我不得不去生成我自己的参数,这是我(相当)不确定的。我遵循了一个快速指南,并为我的曲线给出了这些参数:

p = 10997031918897188677

a = 3628449283386729367

b = 4889270915382004880

x = 3124469192170877657

y = 4370601445727723733

n = 10997031916045924769 (order)

h = 1(协因子)

有人能给我一些建议,如果这条曲线将产生有效的私钥/公钥对?我怎么才能检查这个呢?

任何帮助(/确认)将非常感激,谢谢!

您可以使用OpenSSL的EC_GROUP_check()函数来确保它是有效的组。在下面的程序中,我做了两件事:

  • 用提供的参数生成一个EC_GROUP,并检查它是否有效
  • 使用生成的EC_group生成一个EC_KEY,并检查它是否有效

请注意,您要检查的是EC组是否可以用于生成有效的EC密钥,而不是EC曲线。

详情请参阅评论:)

// gcc 22270485.c -lcrypto -o 22270485
#include <openssl/ec.h>
#include <stdio.h>
int main(){
    BN_CTX *ctx = NULL;
    BIGNUM *p, *a, *b, *x, *y, *order;
    EC_GROUP *group;
    EC_POINT *G;
    int ok = 1;
    ctx = BN_CTX_new();
    p = BN_new();
    a = BN_new();
    b = BN_new();
    x = BN_new();
    y = BN_new();
    order = BN_new();
    /* Set EC_GROUP */
    group = EC_GROUP_new(EC_GFp_mont_method());
    BN_dec2bn(&p, "10997031918897188677");
    BN_dec2bn(&a, "3628449283386729367");
    BN_dec2bn(&b, "4889270915382004880");
    EC_GROUP_set_curve_GFp(group, p, a, b, ctx);
    /* Set generator G=(x,y) and its cofactor */
    G = EC_POINT_new(group);
    BN_dec2bn(&x, "3124469192170877657");
    BN_dec2bn(&y, "4370601445727723733");
    BN_dec2bn(&order, "10997031916045924769");
    EC_POINT_set_affine_coordinates_GFp(group,G,x,y,ctx);
    EC_GROUP_set_generator(group,G,order,BN_value_one());
    /* Checks whether the parameter in the EC_GROUP define a valid ec group */
    if(!EC_GROUP_check(group,ctx)) {
        fprintf(stdout, "EC_GROUP_check() failedn");
        ok = 0;
    }
    if (ok) {
        fprintf(stdout, "It is a valid EC groupn");
    }

    /* Generate a private/public key pair with above EC_GROUP */
    if (ok) {
        BIGNUM *private_key, *pub_x, *pub_y;
        EC_POINT *public_key;
        EC_KEY *eckey;
        pub_x = BN_new(); pub_y = BN_new();
        eckey = EC_KEY_new();
        /* create key on group */
        EC_KEY_set_group(eckey,group);
        EC_KEY_generate_key(eckey);
        /* Verifies that a private and/or public key is valid */
        if (!EC_KEY_check_key(eckey)) {
            fprintf(stdout, "EC_KEY_check_key() failedn");
            ok = 0;
        }
        if (ok) {
            fprintf(stdout, "It is a valid EC key, wheren");
            private_key = EC_KEY_get0_private_key(eckey);
            fprintf(stdout, "tprivate key = %s",BN_bn2dec(private_key));
            public_key = EC_KEY_get0_public_key(eckey);
            EC_POINT_get_affine_coordinates_GFp(group,public_key,pub_x,pub_y,ctx);
            fprintf(stdout, "ntpublic key = ( %s , %s )n",
                BN_bn2dec(pub_x),BN_bn2dec(pub_y));
        }
        BN_free(pub_x); BN_free(pub_y);
        EC_KEY_free(eckey);
    }

    if (ctx)
        BN_CTX_free(ctx);
    BN_free(p); BN_free(a); BN_free(b);
    EC_GROUP_free(group);
    EC_POINT_free(G);
    BN_free(x); BN_free(y); BN_free(order);
    return 0;
}

编译并运行这个命令:

$ gcc 22270485.c -lcrypto -o 22270485
$ ./22270485
标准输出应该输出
It is a valid EC group
It is a valid EC key, where
private key = 1524190197747279622
public key = ( 3228020167903858345 , 9344375093791763077 )

私钥/公钥对每次都会改变,因为EC_KEY_generate_key(eckey)随机选择一个私钥并为每次运行计算相应的公钥。

最新更新