如何使用OpenSSL API从其PEM格式字符串读取RSA公钥?

马丁·德罗兹迪克

我可以使用该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;
}

但是我有很多疑问:

  1. BIO_new_mem_buf需要一个const void*参数,我能传递一个const char*我什至没有从文档中弄清楚
  2. 调用该PEM_read_bio_RSA_PUBKEY函数时,原始示例将其调用如下:rsa = PEM_read_bio_RSA_PUBKEY(keybio, &rsa,NULL, NULL);即使阅读了docs,我也不明白我认为我应该nullptr作为第二个论点通过。
  3. 我应该调用RSA_free返回的RSA指针吗?valgrind无论是否执行,都不会看到内存泄漏。
  4. BIO_free(keybio);完成处理后,我应该打电话BIO吗?valgrind如果不这样做,则会看到内存泄漏,并且在本教程中,该调用丢失了。如果我调用BIO_free(keybio);它,则意味着PEM_read_bio_RSA_PUBKEY从中复制了数据,BIO而不仅仅是链接到它。但是,如果是这样,我是否应该释放它RSA

任何建议都将受到赞赏。我不知道什么是真实的了。

乔巴特

回答每个问题:

  1. 是的,您可以传递const char*,它是强制转换的。
  2. PEM_read_bio_RSA_PUBKEY创建为您分配RSA结构。参数(如果不为null)用于存储指向它的指针,该指针将与返回值相同。它用于简化编码:if (!PEM_read_bio_RSA_PUBKEY(keybio, &rsa, nullptr, nullptr)) { /* error */ }

  3. 是的,您必须使用释放它RSA_free

  4. 是的,您也必须释放它。

PS:OpenSSL文档有点棘手,因为有许多相似的功能仅在算法,结构或数据格式上有所不同。手册页末尾有一个“描述”部分,在其中进行了说明,并删除了每个变体的细节。但是,是的,如果没有好的教程或示例,很难找到答案。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

openssl / RSA-使用公钥解密

Java:如何从字符串创建RSA公钥

GO-如何将公钥从字符串转换为PEM格式

如何读取rsa公钥形式的字符串(由java生成,我想用Python读取)

开始-如何从字符串设置RSA公钥模数?

如何使用openssl创建公钥和私钥?

如何使用OpenSSL提取公钥?

使用Java将RSA公钥导出到PEM字符串

如何使用Bouncycastle Java将PGP公钥存储和读取为字符串?

如何将原始模数和指数转换为RSA公钥(.pem格式)

如何使用OpenSSL从.cer中提取RSA公钥并将其存储在.pem中?

使用PHP生成公钥/私钥对并将公钥导出为.der编码的字符串

使用OpenSSL生成RSA公钥/私钥?

如何使用PEM格式的RSA公钥解码JWT令牌?

如何使用公钥字符串创建OpenSSL :: PKey?

我有一个RSA公钥指数和模数。如何使用Python加密字符串?

如何在iOS中使用RSA公钥加密和解密字符串(纯文本)

如何使用BouncyCastle C#将RSA公钥转换为字符串

如何使用OpenSSL EVP例程进行RSA公钥加密?

java:使用从PEM文件读取的RSA公钥解密数据时,如何避免IllegalBlockSizeException?

使用字符串中的公钥验证JWT

PHP OpenSSL无法读取PEM格式的公钥

Android Java-使用RSA公钥.PEM加密字符串

使用字符串生成公钥和私钥

使用给定的RSA公钥OpenSSL加密字符串

如何使用 openssl 命令解码公钥 .PEM 文件?

如何使用 Openssl:ECDSA 获取公钥

Nodejs使用公钥字符串构造公钥

如何使用 python Openssl 公钥加密字符串?