2012-08-16 144 views
1

我想在C/C++中創建一個RSA密鑰對並將其導出爲字符串以便與之配合使用。openssl在C中創建rsa密鑰對並將其導出

我設法創建密鑰

rsa = RSA_generate_key(bits, exp, NULL, NULL); 
if(RSA_check_key(rsa)!=1){ 
    std::cout << "Error while checking key" << std::endl << std::flush; 
} 

pkey = EVP_PKEY_new(); 
EVP_PKEY_assign_RSA(pkey, rsa); 

從這個角度,我可以寫與PEM_write_PUBKEY()和PEM_write_PrivateKey()的私有和公共密鑰的文件。但是我想要做的就是直接從pkey中將私鑰和公鑰從變量中獲取,最好是PEM格式。我已經環顧四周,但無法找到正確的功能。任何提示?

回答

4

如果您確實需要PEM表示,那麼PEM_write_bio_RSA_PUBKEY()PEM_write_bio_RSAPrivateKey()(及其對應的read)是您想要的功能;給他們內存BIO讓他們寫入內存緩衝區。

您可以通過調用例如內存來創建內存BIO

BIO * b = BIO_new(BIO_s_mem()); 

並通過調用

void * buf; 
BIO_get_mem_ptr(b, &buf); 

獲得內存緩衝區您還可以創建一個存儲BIO通過調用例如圍繞​​現有內存

BIO * b = BIO_new_mem_buf(buf, 9001) 

但生成的BIO將爲只讀。

+0

我將如何導出到PKCS#1 DER(沒有base64的東西)。那麼其他一些格式(PKCS#8,PKCS#12等)呢? – Uri 2012-08-21 18:23:39

+1

@Uri對於DER,你需要'i2d_ *'函數族,它將內存緩衝區作爲第二個參數。要在PKCS8中導出,您需要「PEM_write_bio_PKCS8PrivateKey」或「i2d_PKCS8PrivateKey_bio」,具體取決於格式。要導出一個PKCS12對象,你需要'i2d_PKCS12_bio',但是你必須先用'PKCS12_create'構造PKCS12。 – atomicinf 2012-08-21 19:31:01

+0

另外,根據openssl文檔,RSA_generate_key現在已被棄用,您應該使用RSA_generate_key_ex - http://www.openssl.org/docs/crypto/RSA_generate_key.html – geekonedge 2014-01-09 20:42:53