C ++ openssl - 生成RSA密钥对并读取

时间:2018-05-16 05:33:46

标签: c++ openssl rsa key-pair

我正在尝试使用openssl库生成RSA密钥对,然后稍后读取相同的密钥。但是,它失败了。有时它会给我这个错误:

  

错误:0906D06C:PEM例程:PEM_read_bio:无起始线

有时,它给了我这个错误:

  

错误:0906D06C:LIB(9):函数(109):原因(108)

生成密钥对的正确方法是什么,以后能够读取它?这是我的代码。如果你运行它,你会发现它正确地生成了RSA密钥对,但是以后无法读取它们。

JsonLoader

1 个答案:

答案 0 :(得分:0)

对我来说很好看。除重装外;我会使用PEM_read_bio_RSAPublicKey而不是PEM_read_bio_PUBKEY。 我不确定这是最好的方法。

--- /tmp/stack_openssl.cpp.back 2018-05-25 12:53:12.366488025 +0000
+++ /tmp/stack_openssl.cpp  2018-05-25 13:57:20.614066828 +0000
@@ -18,6 +18,8 @@
   int bits = 2048;
   unsigned long e = RSA_F4;

+  RSA *pb_rsa = NULL;
+  RSA *p_rsa = NULL;
   EVP_PKEY *evp_pbkey = NULL;
   EVP_PKEY *evp_pkey = NULL;

@@ -66,27 +68,32 @@
   printf("\n%s\n%s\n", pri_key, pub_key);

   //verify if you are able to re-construct the keys
-  pbkeybio = BIO_new_mem_buf((void*) pub_key, -1);
+  pbkeybio = BIO_new_mem_buf((void*) pub_key, pub_len);
   if (pbkeybio == NULL) {
     return -1;
   }
-  evp_pbkey = PEM_read_bio_PUBKEY(pbkeybio, &evp_pbkey, NULL, NULL);
-  if (evp_pbkey == NULL) {
+  pb_rsa = PEM_read_bio_RSAPublicKey(pbkeybio, &pb_rsa, NULL, NULL);
+  if (pb_rsa == NULL) {
     char buffer[120];
     ERR_error_string(ERR_get_error(), buffer);
     printf("Error reading public key:%s\n", buffer);
   }
+  evp_pbkey = EVP_PKEY_new();
+  EVP_PKEY_assign_RSA(evp_pbkey, pb_rsa);

-  pkeybio = BIO_new_mem_buf((void*) pri_key, -1);
+  pkeybio = BIO_new_mem_buf((void*) pri_key, pri_len);
   if (pkeybio == NULL) {
     return -1;
   }
-  evp_pkey = PEM_read_bio_PrivateKey(pkeybio, &evp_pkey, NULL, NULL);
-  if (evp_pbkey == NULL) {
+  p_rsa = PEM_read_bio_RSAPrivateKey(pkeybio, &p_rsa, NULL, NULL);
+  if (p_rsa == NULL) {
     char buffer[120];
     ERR_error_string(ERR_get_error(), buffer);
     printf("Error reading private key:%s\n", buffer);
   }
+  evp_pkey = EVP_PKEY_new(); 
+  EVP_PKEY_assign_RSA(evp_pkey, p_rsa);

   BIO_free(pbkeybio);
   BIO_free(pkeybio);