c++ - 使用 libopenssl 从私有(private)转储公钥

标签 c++ openssl rsa private-key public-key

假设我想要一段代码在我的 C++ 应用程序中执行类似 openssl 命令的操作。

openssl rsa -in private.pem -pubout -outform der -out ./out.pub

我怎样才能做到这一点?

我在 github 上寻找示例并提出了以下方案。

key  = PEM_read_bio_RSAPrivateKey(bio, NULL, 0, NULL);
len = i2d_RSAPublicKey(key, &bufp);

它返回的值与我从命令行工具获得的值不同。我想没有从私钥到公钥的转换,它只是保存私钥。任何人都可以告诉我使用 openssl lib 从 private 获取 pub key 的正确方法吗?我也非常感谢任何关于 openssl 的 pub\priv key 示例的链接。

最佳答案

最后,我在 openssl 本身中找到了适当的来源。这正是

期间发生的情况

openssl rsa -in private.pem -pubout -outform der -out ./out.pub

我从原始代码中删除了很多检查以使其更小。

#include <openssl/pem.h>
#include <openssl/x509.h>

EVP_PKEY *load_key(const char *file)
{
    BIO *key=NULL;
    EVP_PKEY *pkey=NULL;

    key=BIO_new(BIO_s_file());
    BIO_read_filename(key,file);
    pkey=PEM_read_bio_PrivateKey(key,NULL,NULL,NULL);

    return pkey;
}

int _tmain(int argc, _TCHAR* argv[])
{
    BIO *out=NULL;
    out=BIO_new(BIO_s_file());
    EVP_PKEY    *pkey;
    RSA *rsa=NULL;

    char *infile = path_to_pem;
    char *outfile = path_to_der;

    pkey = load_key(infile);

    if (pkey != NULL)
        rsa = EVP_PKEY_get1_RSA(pkey);
    EVP_PKEY_free(pkey);

    BIO_write_filename(out,outfile);

    i2d_RSA_PUBKEY_bio(out,rsa);
}

关于c++ - 使用 libopenssl 从私有(private)转储公钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16068830/

相关文章:

c++ - C/C++ 中的简单 OpenSSL RSA 加密让我头疼

python-3.x - 在 Python 3.X 中实现 RSA/pkcs1_padding

java - 在java中用公钥加密,在C#中用私钥RSA解密

c++ - STL Map _Rb_tree_insert_and_rebalance 在哪里实现?

c++ - RapidJSON 循环遍历字符串数组?

java - 创建c linux库的问题

c - 使用自定义 openssl 二进制文件构建 OpenVPN(无源)

c++ - Cin 在 while 和 for 循环中被忽略

c++ - 子进程如何告诉其父进程创建一个新的子进程?

c - 支持 AES-NI 的 EVP 接口(interface)