OpenSSL笔记-PKCS#1和PKCS#8的区别及分别调用的API

x33g5p2x  于2022-07-19 转载在 其他  
字(1.2k)|赞(0)|评价(0)|浏览(582)

这玩意折腾了一天,有个老外的代码,公钥用了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类型,还是二进制的,所以这个返回值比较重要。

相关文章