gpt4 book ai didi

openssl - 使用 OpenSSL 库生成 EC key 对

转载 作者:行者123 更新时间:2023-12-04 10:13:54 29 4
gpt4 key购买 nike

我使用 OpenSSL 库来生成 key 对。这是代码:

#include <openssl/obj_mac.h>
#include <openssl/ec.h>

// See: https://rjordaney.is/code_exercises/ecdsa_openssl/

OpenSslKey::OpenSslKey()
{
EC_KEY *key_pair_obj = nullptr;;
BIGNUM *priv_key;
EC_POINT *pub_key;
EC_GROUP *secp256k1_group;

char *pub_key_char;
char *priv_key_char;

int ret_error;

// Generate secp256k1 key pair
key_pair_obj = EC_KEY_new_by_curve_name(NID_secp256k1);
ret_error = EC_KEY_generate_key(key_pair_obj);

// Get private key
priv_key = (BIGNUM *)EC_KEY_get0_private_key(key_pair_obj);
priv_key_char = BN_bn2hex(priv_key);

// Get public key
pub_key = (EC_POINT *)EC_KEY_get0_public_key(key_pair_obj);
secp256k1_group = EC_GROUP_new_by_curve_name(NID_secp256k1);
pub_key_char = EC_POINT_point2hex(secp256k1_group, pub_key, POINT_CONVERSION_UNCOMPRESSED, nullptr);
EC_GROUP_free(secp256k1_group);

printf("Private key: %s\n", priv_key_char);
printf("Public key : %s\n", pub_key_char);
}

输出如下所示:
Pivate key: 83A2B7068D5DA6CA864F5E4232F51D59BAF229B65D59B4D2E0EB90ED04EF29CF
Public key: 04B6E78EACFDDD884EB28FAAF5549FBD7794CBFE236437A91965D9AC865178F5B9376400B4A0CEDC664A44934578246484F33395F452919C6F3EFC1D776029F9FF

如何获取 DER 格式的私钥和公钥?

我补充说:
3056301006072a8648ce3d020106052b8104000a034200

在公钥前面,像这样看起来公钥是有效的 key 。这是正确的还是 OpenSSL 库提供了将公钥转换为 DER 的功能?

我该怎么做才能获得 DER 格式的关联私钥?是否还有未压缩版本的私钥?

更新 : 在这里你可以找到我的最终版本:
OpenSslKey::OpenSslKey()
{
EC_KEY *key_pair_obj = nullptr;;
BIGNUM *priv_key;
EC_POINT *pub_key;
EC_GROUP *secp256k1_group;

char *pub_key_char;
char *priv_key_char;

int ret_error;

// Generate secp256k1 key pair
key_pair_obj = EC_KEY_new_by_curve_name(NID_secp256k1);
ret_error = EC_KEY_generate_key(key_pair_obj);

// Get private key
priv_key = (BIGNUM *)EC_KEY_get0_private_key(key_pair_obj);
priv_key_char = BN_bn2hex(priv_key);

// Get public key
pub_key = (EC_POINT *)EC_KEY_get0_public_key(key_pair_obj);
secp256k1_group = EC_GROUP_new_by_curve_name(NID_secp256k1);
pub_key_char = EC_POINT_point2hex(secp256k1_group, pub_key, POINT_CONVERSION_UNCOMPRESSED, nullptr);
EC_GROUP_free(secp256k1_group);

printf("Private key: %s\n", priv_key_char);
printf("Public key : %s\n", pub_key_char);

// Convert the private key to DER
unsigned char *priv_key_char_der = nullptr;
int priv_key_len_der = i2d_ECPrivateKey(key_pair_obj, &priv_key_char_der);

// Convert the public key to der
unsigned char *pub_key_char_der = nullptr;
int pub_key_len_der = i2d_EC_PUBKEY(key_pair_obj, &pub_key_char_der);
}

最佳答案

What do I have to do to get associated private key in DER format?



OpenSSL 提供了多种转换函数 i2d_ECPrivateKey() and i2d_EC_PUBKEY() 你可以利用这一点。您可以使用 i2d_ECPrivateKey 选择让输出进入内存。 , 与 i2d_ECPrivateKey_bio 的简历或指向带有 i2d_ECPrivateKey_fp 的文件指针.

例如,使用将 DER 编码中的私钥写入文件 bio 的方法:
BIO *bio = BIO_new(BIO_s_file());
BIO_write_filename(bio, "private_key.der");
i2d_ECPrivateKey_bio(bio, key_pair_obj);
BIO_free(bio);

对于私钥和公钥转换函数,请注意输入是 key_pair_obj , 类型为 EC_KEY .

Is there also an uncompressed version of the private key?



key 对的私有(private)部分没有未压缩版本。一些解释见 ECC Keys

关于openssl - 使用 OpenSSL 库生成 EC key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61173864/

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