如何使用OpenSSL API从其PEM格式字符串中读取RSA公钥
How to read an RSA public key from a its PEM format string using the OpenSSL API?
我可以使用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);
即使在阅读了文档之后,我也不明白。我认为我应该通过nullptr
作为第二个论点 - 我应该在返回的
RSA
指针上调用RSA_free
吗?无论我是否这样做,valgrind
都不会看到内存泄漏 - 我应该在使用完
BIO
后拨打BIO_free(keybio);
吗?如果我不这样做,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
发布它。 - 是的,你也必须释放它
p。S.:OpenSSL文档有点棘手,因为有很多类似的函数,只是在算法、结构或数据格式上有所不同。在手册页的末尾有一个描述部分,其中对它们进行了解释,删除了每个变体的细节。但是,是的,如果没有一个好的教程或例子,很难找到它。
相关文章:
- 如何使用Luacneneneba API正确读取字符串和表参数
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 如何从字符串C++读取多个整数
- 使用字符串读取的字符串
- 从文件到字符串读取并传递到功能
- C++ cin 将字符串读取到 int 类型中返回 0
- 使用CIN和/或字符串读取带有混合输入的文本文件
- 将两个字符串作为一个字符串读取
- 如何将WCP 1252字符串读取为std::tstring
- 如何将字符串读取为字符串向量或将整数读取为整数向量
- 将一系列字符串读取到char数组中
- 如何在 c++ 中将文件中的段落作为单个字符串读取
- 从 txt 文件中将后缀表达式作为字符串读取
- C++银行项目;如何将一组字符串读取为单独的浮点数并添加它们
- 在 c++ 中循环字符串读取器
- 将字符串读取为命令行参数C++
- 如何在QT中使用QDomDocument对象将字符串读取为XML
- 使用Matio库将.mat文件中的字符串读取到C++中
- 作为字符串读取第一列数据文件
- 如何在字符串读取完成时停止c++的recv() ?