公私钥保存成PEM文件

这段代码演示了如何使用OpenSSL库在Visual Studio 2010环境下生成RSA公私钥对,并将它们导出为PEM格式。包括PKCS#1和PKCS#8格式的公钥与私钥,同时展示了带密码加密的私钥导出。代码直接打印PEM数据,实际应用中可将其保存到文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

软件版本

openssl:版本1.1.1k,编译后的静态库
visual studio:版本2010

全部代码

#pragma comment(lib, "Crypt32.lib")
#pragma comment(lib, "compile_win_x86_lib\\lib\\libcrypto.lib")
#pragma comment(lib, "compile_win_x86_lib\\lib\\libssl.lib")
#include "openssl/rsa.h"
#include "openssl/pem.h"
#include "openssl/x509v3.h"
#include "openssl/pkcs12.h"


void testSavePem()
{
	BIO* outBio = NULL;
	char buf[4096];
	RSA* rsaCtx = NULL;
	PKCS8_PRIV_KEY_INFO* pkcs8Info = NULL;
	EVP_PKEY* pEvKey = NULL;
	X509_SIG* x509Sig = NULL;

	memset(buf, 0x00, sizeof(buf));

	rsaCtx = RSA_generate_key(2048, 65537, NULL, NULL);

	/* public key PKCS#8  */
	outBio = BIO_new(BIO_s_mem());
	PEM_write_bio_RSA_PUBKEY(outBio, rsaCtx); 
	BIO_read(outBio, buf, sizeof(buf));
	printf("public key PKCS#8 pem file data=\n%s\n", buf);
	BIO_free(outBio);
	outBio = NULL;

	/* public key PKCS#1  */
	memset(buf, 0x00, sizeof(buf));
	outBio = BIO_new(BIO_s_mem());
	PEM_write_bio_RSAPublicKey(outBio, rsaCtx);
	BIO_read(outBio, buf, sizeof(buf));
	printf("public key PKCS#1 pem file data=\n%s\n", buf);
	BIO_free(outBio);
	outBio = NULL;

	/* private key PKCS#1  */
	memset(buf, 0x00, sizeof(buf));
	outBio = BIO_new(BIO_s_mem());
	PEM_write_bio_RSAPrivateKey(outBio, rsaCtx, NULL, NULL, 0, NULL, NULL);
	BIO_read(outBio, buf, sizeof(buf));
	printf("private key PKCS#1 pem file data=\n%s\n", buf);
	BIO_free(outBio);
	outBio = NULL;

	/* private key PKCS#8 */
	memset(buf, 0x00, sizeof(buf));
	outBio = BIO_new(BIO_s_mem());
	pEvKey = EVP_PKEY_new();
	EVP_PKEY_set1_RSA(pEvKey, rsaCtx);
	pkcs8Info = EVP_PKEY2PKCS8(pEvKey);
	PEM_write_bio_PKCS8_PRIV_KEY_INFO(outBio, pkcs8Info);
	BIO_read(outBio, buf, sizeof(buf));
	printf("private key PKCS#8 pem file data=\n%s\n", buf);
	BIO_free(outBio);
	outBio = NULL;
	EVP_PKEY_free(pEvKey);
	pEvKey = NULL;
	PKCS8_PRIV_KEY_INFO_free(pkcs8Info);

	/* private key with password encrypt PKCS#1 */
	memset(buf, 0x00, sizeof(buf));
	outBio = BIO_new(BIO_s_mem());
	PEM_write_bio_RSAPrivateKey(outBio, rsaCtx, EVP_aes_256_cbc(), (unsigned char*)"123456", 6, NULL, NULL);//PKCS#1
	BIO_read(outBio, buf, sizeof(buf));
	printf("private key PKCS#1 pem file data with password=\n%s\n", buf);
	BIO_free(outBio);
	outBio = NULL;

	/* private key with password encrypt PKCS#8 */
	memset(buf, 0x00, sizeof(buf));
	outBio = BIO_new(BIO_s_mem());
	pEvKey = EVP_PKEY_new();
	EVP_PKEY_set1_RSA(pEvKey, rsaCtx);
	pkcs8Info = EVP_PKEY2PKCS8(pEvKey);
	x509Sig = PKCS8_encrypt(-1, EVP_aes_256_cbc(), (char*)"123456", 6, NULL, 0, 0, pkcs8Info);
	PEM_write_bio_PKCS8(outBio, x509Sig);
	BIO_read(outBio, buf, sizeof(buf));
	printf("private key PKCS#8 pem file data with password=\n%s\n", buf);
	BIO_free(outBio);
	outBio = NULL;
	EVP_PKEY_free(pEvKey);
	pEvKey = NULL;
	X509_SIG_free(x509Sig);
	PKCS8_PRIV_KEY_INFO_free(pkcs8Info);
}

代码说明

1、首先产生了RSA公私钥对;
2、然后对公钥私钥分别输出PEM格式数据;
3、格式有PKCS#1和PKCS#8,私钥分别有不带密码和带密码;
4、本测试直接printf输出PEM数据,没有保存文件,可根据各自需要新建文件保存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值