2012-08-09 82 views
5

我在我的項目中使用公鑰/私鑰來加密/解密一些數據。使用OpenSSL從內存中讀取公鑰/私鑰

我在服務器上託管公鑰(「public.pem」)。

「public.pem」看起來是這樣的:

-----BEGIN PUBLIC KEY----- 
..... 
..... 
-----END PUBLIC KEY----- 

我寫了這個下載公共密鑰並將其保存到磁盤,然後用文件描述符該文件調用OpenSSL的PEM_read_RSA_PUBKEY()一個客戶端。 該操作效果很好,結果是一個準備好加密的RSA對象。

我想避免每次都將公鑰寫入磁盤(因爲我已經在內存中存儲了緩衝區)。

如何在不將緩衝區保存到磁盤的情況下執行相同的操作? 我注意到一個名爲PEM_read_bio_RSAPublicKey()的函數,但我不確定它是否使用了BIO結構。我在正確的道路上嗎?

所以真正的問題是:如何直接從內存中讀取公鑰/私鑰到RSA對象,而不是從文件描述符中讀取。

回答

14

你是在正確的軌道上。您必須通過BIO_new_mem_buf()通過BIO緩衝區將PEM密鑰包裝在內存中。換句話說,這樣的:

BIO *bufio; 
RSA *rsa 

bufio = BIO_new_mem_buf((void*)pem_key_buffer, pem_key_buffer_len); 
PEM_read_bio_RSAPublicKey(bufio, &rsa, 0, NULL); 

同樣的方法是有效的RSA私鑰(通過PEM_read_bio_RSAPrivateKey),但在這種情況下,你肯定需要照顧的密碼。有關詳細信息,請檢查man page

+1

我現在試過這個選項。加密是好的,解密不起作用。公鑰是否需要像以下那樣,或者當我將它發送給客戶端時,是否需要刪除「BEGIN PUBLIC KEY」? ----- BEGIN PUBLIC KEY ----- ..... ..... ----- END PUBLIC KEY ----- – user1144031 2012-08-09 23:49:35

+0

手冊頁鏈接已損壞:(。任何人都有更新的鏈接? – digawp 2017-01-06 08:09:59

2

SquareRootOfTwentyThree的方法不適合我。這是我的解決方案。

BIO* bio = BIO_new(BIO_s_mem()); 
int len = BIO_write(bio, pem_key_buffer, pem_key_buffer_len); 
EVP_PKEY* evp_key = PEM_read_bio_PUBKEY(bio, NULL, NULL, NULL); 
RSA* rsa = EVP_PKEY_get1_RSA(evp_key);