我可以使用该PEM_read_RSA_PUBKEY
功能轻松读取PEM文件。但是,我有一个内置于可执行文件中的公用密钥,因此我不希望创建一个临时文件。阅读此示例/教程:http : //hayageek.com/rsa-encryption-decryption-openssl-c/我想出了以下解决方案:
#include <openssl/rsa.h>
#include <openssl/pem.h>
#include <openssl/bio.h>
#include <QFile>
#include <QByteArray>
#include <stdexcept>
#include <cassert>
#include <cstring>
RSA* createRSA(const char* key)
{
RSA *rsa = nullptr;
BIO *keybio ;
keybio = BIO_new_mem_buf(key, -1); // !!!
if (!keybio)
{
throw std::runtime_error("Failed to create key BIO");
}
rsa = PEM_read_bio_RSA_PUBKEY(keybio, nullptr, nullptr, nullptr); // !!!
if(!rsa )
{
throw std::runtime_error("Failed to create RSA");
}
BIO_free(keybio); // !!!
return rsa;
}
int main()
{
QFile publicKeyFile(":/public.pem");
publicKeyFile.open(QIODevice::ReadOnly);
auto data = publicKeyFile.readAll();
RSA* rsa = createRSA(data.data());
EVP_PKEY* verificationKey = EVP_PKEY_new();
auto rc = EVP_PKEY_assign_RSA(verificationKey, RSAPublicKey_dup(rsa));
assert(rc == 1);
if(verificationKey)
EVP_PKEY_free(verificationKey);
return 0;
}
但是我有很多疑问:
BIO_new_mem_buf
需要一个const void*
参数,我能传递一个const char*
?我什至没有从文档中弄清楚。PEM_read_bio_RSA_PUBKEY
函数时,原始示例将其调用如下:rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);
即使阅读了docs,我也不明白。我认为我应该nullptr
作为第二个论点通过。RSA_free
返回的RSA
指针吗?valgrind
无论是否执行,都不会看到内存泄漏。BIO_free(keybio);
完成处理后,我应该打电话BIO
吗?valgrind
如果不这样做,则会看到内存泄漏,并且在本教程中,该调用丢失了。如果我调用BIO_free(keybio);
它,则意味着PEM_read_bio_RSA_PUBKEY
从中复制了数据,BIO
而不仅仅是链接到它。但是,如果是这样,我是否应该释放它RSA
?任何建议都将受到赞赏。我不知道什么是真实的了。
回答每个问题:
const char*
,它是强制转换的。PEM_read_bio_RSA_PUBKEY
创建为您分配RSA结构。参数(如果不为null)用于存储指向它的指针,该指针将与返回值相同。它用于简化编码:if (!PEM_read_bio_RSA_PUBKEY(keybio, &rsa, nullptr, nullptr)) { /* error */ }
是的,您必须使用释放它RSA_free
。
PS:OpenSSL文档有点棘手,因为有许多相似的功能仅在算法,结构或数据格式上有所不同。手册页末尾有一个“描述”部分,在其中进行了说明,并删除了每个变体的细节。但是,是的,如果没有好的教程或示例,很难找到答案。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句