簡體   English   中英

如何以可讀的方式讀寫“EVP_PKEY”中包含的公鑰和私鑰?

[英]How to read and write the public and private key contained in "EVP_PKEY" in a readable way?

我想以人類可讀的形式顯示包含在“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'})|

如何在 std::cout 中顯示“*ppkey”並更正此錯誤?

我嘗試 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;

那里的錯誤來自函數,因為要遵守條件 if 。 如何定義好函數的參數3,因為我認為問題來自於此?

有沒有其他功能,其他方法來顯示和寫入密鑰?

請幫幫我

您正在為 BIO ( bp ) 參數傳遞一個 NULL:

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

這將導致EVP_PKEY_print_private失敗。 BIO 表示要打印關鍵數據的位置,並且必須為非 NULL。 如果您只想打印到stdout那么您可以像這樣創建它:

BIO *bp = BIO_new_fp(stdout, BIO_NOCLOSE);

確保之后釋放 BIO:

BIO_free(bp);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM