这玩意折腾了一天,有个老外的代码,公钥用了PKCS#1,私钥用了PKCS#8。调用了不同的API,而我的全是生成的PKCS#8,后面查阅了大量资料和长时间调试程序,才发现了问题,在此记录下。
用OpenSSL生成的pem文件,公私密钥有两种格式
公钥是(PKCS#1):
-----BEGIN RSA PUBLIC KEY-----
*******************************************
-----END RSA PUBLIC KEY-----
和(PKCS#8)
-----BEGIN PUBLIC KEY-----
*******************************************
-----END PUBLIC KEY-----
私钥是(PKCS#1):
-----BEGIN RSA PRIVATE KEY-----
*******************************************
-----END RSA PRIVATE KEY-----
总结下:在OpenSSL1.1.x版本中公钥有RSA的PKCS#8、PKCS#1,私钥只有PKCS#8标准,他们的区别如下:
PKCS#1:是标准RSA密钥对规范,但都是裸奔的;
PKCS#8:是对加密后的密钥进行了描述,也就是说P8格式的密钥不是裸奔的。
PKCS#1,调用的API:
//生成RSA对象的
PEM_read_bio_RSA_PUBKEY();
PKCS#8,调用的API:
//生成RSA对象的
PEM_read_bio_RSAPublicKey();
PEM_read_bio_RSAPrivateKey();
关于加解密都是调用相同的4个函数:
/* next 4 return -1 on error */
int RSA_public_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int RSA_private_encrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int RSA_public_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
int RSA_private_decrypt(int flen, const unsigned char *from,
unsigned char *to, RSA *rsa, int padding);
有一点要提醒的,他们的返回值都是加密,解密后,数据的长度,因为是unsigned char类型,还是二进制的,所以这个返回值比较重要。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://it1995.blog.csdn.net/article/details/125850424
内容来源于网络,如有侵权,请联系作者删除!