openssl库的PEM_read_bio_RSAPublicKey和PEM_read_bio_RSA_PUBKEY API之间的差别

本文章参考:http://www.manongjc.com/article/57939.html

本文记录openssl库实现rsa加解密之PEM_read_bio_RSAPublicKey() 和 PEM_read_bio_RSA_PUBKEY()两个API的异同。

RSA加密的public key格式有多种,常见的有两种,一种密钥头为 ‘-----BEGIN RSA PUBLIC KEY-----’ ,一种开头为 ‘-----BEGIN PUBLIC KEY-----’,二者分别对应RSA的PKCS#1和PKCS#8格式。使用openssl库加载RSA的公钥时,使用的函数也不同。以字符串公钥为例,对PKCS#1格式的密钥加载使用PEM_read_bio_RSAPublicKey()函数,对PKCS#8格式公钥的加载使用PEM_read_bio_RSA_PUBKEY()函数。对于不那么熟悉rsa的同学,使用时注意区分者,可以减少不必要的麻烦。

string Base64Encode_std(const string& encodeStr){
//ignore
}
string rsaEncode(const unsigned char * in, int len, const char *pubKey){
	BIO *bio=NULL;
	RSA *rsa = NULL;
	char szOut[512] = {0};
	string pkcs1_header = "-----BEGIN RSA PUBLIC KEY-----";
	string pkcs8_header = "-----BEGIN PUNLIC KEY-----";
	bio = BIO_bew(BIO_s_mem());
	if (NULL == bio) return "";
	BIO_puts(bio,pubKey);
	if( 0 == strncmp(pubKey,pkcs8_header.c_str(),pkcs8.size())){
		rsa = PEM_read_bio_RSA_PUBKEY(bio,NULL,NULL,NULL);
	}
	else if(0 == strncmp(pubKey,pkcs1_header.c_str(),pkcs1.size())){
		rsa = PEM_read_bio_RSAPublicKey(bio,NULL,NULL,NULL);
	}
	if(NULL == rsa) return "";
	int ret = RSA_public_encrypt(len,in,(unsigned char*)szOut,rsa,RSA_PKCS1_PADDING);
	if (ret < 0 ) return "";
	string encrypt_data = string(szOut,ret);
	string resultStr = Base64Encode_std(encrypt_data);
	if(bio) BIO_free(bio);
	if(rsa) RSA_free(rsa);
	return resultStr;
}

上面代码中加了一点儿判断,区分了一下pkcs#8和pkcs#1的格式,完全的情况还有一些其他的格式。

StackOverflow上有个关于这个的回答,写的比较详细,有兴趣的可以参考。
https://stackoverflow.com/questions/18039401/how-can-i-transform-between-the-two-styles-of-public-key-format-one-begin-rsa/29707204#29707204
要了解rsa加密的算法原理,可以参考这个知乎的文章
https://zhuanlan.zhihu.com/p/45317622

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
PEM_read_bio_RSA_PUBKEY 函数的用法如下: ```c #include <openssl/rsa.h> #include <openssl/pem.h> RSA *PEM_read_bio_RSA_PUBKEY(BIO *bp, RSA **x, pem_password_cb *cb, void *u); ``` 这个函数的四个参数含义如下: - `bp`:一个BIO指针,用于读取PEM格式的RSA公钥内容。 - `x`:指向RSA结构体指针的指针,用于返回读取RSA公钥。 - `cb`:密码回调函数指针,用于解密加密的PEM格式的RSA公钥文件(如果有)。 - `u`:传递给密码回调函数的上下文指针。 使用 PEM_read_bio_RSA_PUBKEY 函数读取PEM格式的RSA公钥文件的示例代码如下: ```c #include <stdio.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main() { // 打开PEM格式的RSA公钥文件 FILE *fp = fopen("public_key.pem", "r"); if (!fp) { printf("Error: Failed to open public_key.pem file.\n"); return 1; } // 创建BIO对象并将PEM格式的公钥内容写入BIO对象中 BIO *bio = BIO_new_fp(fp, BIO_NOCLOSE); // 读取PEM格式的RSA公钥并转换为RSA结构体 RSA *rsa = NULL; rsa = PEM_read_bio_RSA_PUBKEY(bio, &rsa, NULL, NULL); if (!rsa) { printf("Error: Failed to read RSA public key.\n"); return 1; } // 打印RSA公钥信息 printf("RSA public key information:\n"); printf("Modulus size: %d bits\n", RSA_size(rsa) * 8); printf("Exponent: %lu\n", rsa->e); // 释放资源 RSA_free(rsa); BIO_free(bio); fclose(fp); return 0; } ``` 在使用这个函数之前,需要先安装 OpenSSL 并包含头文件 `#include <openssl/rsa.h>` 和 `#include <openssl/pem.h>`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值