gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 03:14:48 25 4
gpt4 key购买 nike

(仅介绍一点上下文:)我是密码学的新手,但对于一个学校项目,我想创建 64 位 ECC 曲线的概念验证。 (是的,我知道 64 位 key 不是很安全!)但是据我所知,没有针对 64 位的 SEC 标准参数,只有 160-512 位。

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

p = 10997031918897188677

一个= 3628449283386729367

b = 4889270915382004880

x = 3124469192170877657

y = 4370601445727723733

n = 10997031916045924769(顺序)

h = 1(辅因子)

关于此曲线是否会生成有效的私钥/公钥对,有人可以给我一些建议吗?我怎么能检查这个?

任何帮助(/确认)将不胜感激,谢谢!

最佳答案

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

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

请注意,您要检查的是 EC 组是否可用于生成有效的 EC key ,而不是 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() failed\n");
ok = 0;
}

if (ok) {
fprintf(stdout, "It is a valid EC group\n");
}


/* 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() failed\n");
ok = 0;
}

if (ok) {
fprintf(stdout, "It is a valid EC key, where\n");

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, "\n\tpublic 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) 会随机选择一个私钥并为每次运行计算相应的公钥。

关于encryption - 我怎样才能最好地检查这些椭圆曲线参数是否有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22270485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com