Generat E C KeyPair с библиотекой OpenSSL - PullRequest
2 голосов
/ 12 апреля 2020

Я использую библиотеку 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);
}

1 Ответ

2 голосов
/ 12 апреля 2020

Что мне нужно сделать, чтобы получить связанный закрытый ключ в формате DER?

OpenSSL предоставляет несколько вариантов функций преобразования i2d_ECPrivateKey() и i2d_EC_PUBKEY() что вы можете использовать для этого. Вы можете выбрать для вывода go в память с 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);

Для функций преобразования ключей private и publi c обратите внимание, что вводом является key_pair_obj типа EC_KEY.

Существует также несжатая версия закрытого ключа?

Не существует несжатой версии закрытой части пары ключей. Для объяснения см. E CC Ключи

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...