ECDSA Ошибка генерации пары ключей - PullRequest
0 голосов
/ 28 июня 2018

Я попробовал приведенный ниже код для генерации пары ключей, но он печатает 8-байтовые данные, которые являются ничем иным, как адресом памяти. Может ли кто-нибудь пролить свет на то, в чем проблема, как распечатать закрытый ключ на 256 бит / 32 байта и соответствующий ему открытый ключ

Я запускаю программу в VS 2010 и установил openssl win32, а также связал openssl в свойствах моего проекта.

выходные данные:

Закрытый ключ: 00156C90

Открытый ключ: 00158cc0

#include "stdafx.h"
#include <iostream>
#include <openssl/obj_mac.h>
#include <openssl/ec.h>
#include <openssl/bn.h>

int main()
    {
    //EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp224r1);
    //EC_KEY* key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1);
        EC_KEY* key = EC_KEY_new_by_curve_name(NID_secp256k1);


    if(!key)
    {
        std::cerr << "Error creating curve key" << '\n';
        return EXIT_FAILURE;
    }

    if(!EC_KEY_generate_key(key))
    {
        std::cerr << "Error generating curve key" << '\n';
        EC_KEY_free(key);
        return EXIT_FAILURE;
    }

    BIGNUM const* prv = EC_KEY_get0_private_key(key);
    if(!prv)
    {
        std::cerr << "Error getting private key" << '\n';
        EC_KEY_free(key);
        return EXIT_FAILURE;
    }



    std::cout << "Private key: " << prv << '\n';

    EC_POINT const* pub = EC_KEY_get0_public_key(key);
    if(!pub)
    {
        std::cerr << "Error getting public key" << '\n';
        EC_KEY_free(key);
        return EXIT_FAILURE;
    }


    std::cout << "Public key: " << pub << '\n';


    // Use keys here ...

    EC_KEY_free(key);


    }

1 Ответ

0 голосов
/ 28 июня 2018

Вы должны использовать соответствующие функции для отображения значений BIGNUM и EC_POINT:


В документации млрд :

Основной объект в этой библиотеке - BIGNUM. Он используется для хранения одного большого целого числа. Этот тип следует считать непрозрачным , и поля не должны быть изменены или доступны напрямую.

и

Преобразование BIGNUM с во внешние форматы описано в BN_bn2bin.

Где мы находим BN_bn2hex(), который может использоваться для распечатки шестнадцатеричных значений закрытого ключа (шестнадцатеричные числа обычно используются для ключей).


Аналогично, EC_POINT_point2hex определено для EC_POINT_new (_new - это только первая из многих функций, определенных для этой страницы руководства). В нем четко не указано, какое представление точек используется.

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