使用OpenSSL从内存中读取公钥/私钥

时间:2012-08-09 14:59:07

标签: c ssl openssl

我在项目中使用公钥/私钥来加密/解密某些数据。

我在服务器上托管公钥(“public.pem”)。

“public.pem”看起来像这样:

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

我编写了一个客户端,下载此公钥并将其保存到磁盘,然后使用文件描述符将OpenSSL的PEM_read_RSA_PUBKEY()调用到该文件。 此操作很有效,结果是一个准备加密的RSA对象。

我想避免每次都将公钥写入磁盘(因为我已经在内存中有缓冲区了)。

如何在不将缓冲区保存到磁盘的情况下执行相同的操作? 我注意到一个名为PEM_read_bio_RSAPublicKey()的函数,但我不确定它是否使用了BIO结构。我在正确的道路上吗?

所以真正的问题是:如何直接从内存而不是文件描述符中读取RSA对象的公钥/私钥。

3 个答案:

答案 0 :(得分: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 :(得分:4)

SquareRootOfTwentyThree的方法对我不起作用。这是我的解决方案。

@include('views.acp.review.check-details') 

答案 2 :(得分:1)

这里是完整的示例,显示了嵌入式密钥以及如何使用C ++ 11唯一指针 管理OpenSSL资源。

已更新:根据spectras的评论进行。不再使用专业化 的import json from pprint import pprint import ast with open('data2.txt') as f: data = f.read().replace("ObjectId(", "'ObjectId(").replace(")", ")'").replace("\n", ","); listDict = ast.literal_eval(data) print(listDict)

({'_id': 'ObjectId("5c04cc50792d7153282a0874")', 'Name': 'Nimish', 'Marks': '100'}, {'_id': 'ObjectId("5c04cc61792d7153282a0875")', 'Name': 'Ayush', 'Marks': '78'})