2012-08-09 196 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);