Как читать и записывать publi c и закрытый ключ, содержащиеся в EVP_PKEY, в удобочитаемом виде? - PullRequest
0 голосов
/ 07 февраля 2020

Я хотел бы отобразить пару publi c и секретный ключ, содержащуюся в параметре "pkey" функции EVP_PKEY_keygen, в удобочитаемой форме, то есть отобразить ключ кодировщика, например, такой: 1GERarDJyXsANQqWGGdC3C26GA8K9yMQ7n. Вот фрагмент кода: генерация параметров и ключей:

 EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey = NULL;

ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
if(ctx == NULL)
{
  std::cout << "error 1" << std::endl;
}
if(EVP_PKEY_keygen_init(ctx) <= 0)
{
    std::cout << "error 2" << std::endl;
}
if(EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_X9_62_prime256v1) <= 0)
{
    std::cout << "error 3" << std::endl;
}
if(EVP_PKEY_keygen(ctx, &pkey) <= 0)
{
    std::cout << "error 4" << std::endl;
}
EVP_PKEY_CTX_free(ctx);

Моя попытка 1 отобразить закрытый ключ, содержащийся в «ppkey»

EC_KEY *key;
if(!(key = EVP_PKEY_get1_EC_KEY(pkey)))
{
    std::cout << "error 5" << std::endl;
}
const BIGNUM *prvkey;
if(!(prvkey = EC_KEY_get0_private_key(key)))
{
  std::cout << "error 6" << std::endl;
}
unsigned char *to = NULL;
if(!BN_bn2mpi(prvkey, to))
{
  std::cout << "error 7" << std::endl;
}
 std::cout << *prvkey <<std::endl;

, это отображение ошибки:

error: no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'const BIGNUM' {aka 'const bignum_st'})|

как отобразить "* ppkey" в std :: cout и исправить эту ошибку?

Моя попытка 2 отобразить закрытый ключ, содержащийся в «ppkey»:

  BIO *bp = NULL;
  if(!EVP_PKEY_print_private(bp, pkey, 1, NULL))
   {
      std::cout << "error 5" << std::endl;
   }
       std::cout << bp <<std::endl;

, там возникает ошибка из-за того, что условие должно соблюдаться. Как правильно определить параметр 3 функции, потому что я думаю, что проблема в этом?

Есть ли какая-либо другая функция, другой метод для отображения и записи ключей?

Помогите мне, пожалуйста

1 Ответ

0 голосов
/ 07 февраля 2020

Вы передаете NULL для параметра BIO (bp):

 BIO *bp = NULL;
 if(!EVP_PKEY_print_private(bp, pkey, 1, NULL))

Это приведет к сбою EVP_PKEY_print_private. BIO представляет место, где вы хотите, чтобы данные ключа были напечатаны, и должно быть ненулевым. Если вы просто хотите напечатать до stdout, вы можете создать его следующим образом:

BIO *bp = BIO_new_fp(stdout, BIO_NOCLOSE);

После этого обязательно освободите БИО:

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