Я использую библиотеку OpenSSL для генерации пары ключей. Вот код:
#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
Как получить закрытый ключ и ключ publi c в формате DER?
Я добавил:
3056301006072a8648ce3d020106052b8104000a034200
перед ключом publi c, и похоже, что ключ publi c является допустимым ключом. Это правильно или библиотека OpenSSL предоставляет функцию для преобразования ключа publi c в 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);
}