Openssl RSA密钥PEM和DER转换 - 不匹配

时间:2016-11-26 19:34:35

标签: openssl rsa

我正在研究使用RSA密钥生成和操作的openssl。首先,我生成了一个以PEM格式编码但未加密的密钥对:

openssl genpkey -algorithm RSA -out key.pem -pkeyopt rsa_keygen_bits:2048

然后我转换为DER格式:

openssl rsa -inform PEM -outform DER -in key.pem -out key1.cer

然后我把它转换回PEM编码:

openssl rsa -inform DER -outform PEM -in key1.cer -out key2.pem

现在如果我比较两者,它们的内容不同(BASE64编码文本)。文件的大小也不同......

diff key.pem key2.pem

为什么?我在这里做错了吗?

这里附有所有钥匙。 https://www.dropbox.com/sh/ec1sm3y63sahwks/AAB6At3x_j5LRyf63gJDJn39a?dl=0

谢谢, 荻帆

1 个答案:

答案 0 :(得分:0)

查看PEM文件,您会看到一个以-----BEGIN PRIVATE KEY-----开头,另一个以-----BEGIN RSA PRIVATE KEY-----开头。 PEM块的BEGIN和END行中的字指定块中数据的格式,这些字符指定OpenSSL支持的大约10个(具体取决于您的计算方式)不同数据格式中的两个RSA密钥。

第一部分是第5部分的未加密的PKCS8 republished as RFC 5208变种.PKCS8可以处理许多不同算法的私钥,包括RSA DSA DH和ECDSA,有或没有密码 - 基于密钥的加密(PBE)。 openssl genpkey旨在处理多种算法,并使用PKCS8格式来执行此操作。

第二个是A.1节中仅PKA1 republished as RFC3447 et pred的RSA 私钥语法。此格式由较早的openssl rsaopenssl genrsa函数编写,因为它们只处理RSA,并且称为“传统”和#39;或者'遗产'格式以区别于PKCS8。 PKCS1没有定义任何加密格式,但OpenSSL支持通用的PEM加密方案,如果您没有请求,可以应用于此格式。但是,OpenSSL'遗产' PEM加密不如PKCS8中使用的那么好,因此如果需要安全性,通常应该使用PKCS8,或者对于带有证书的私钥,可能使用PKCS12。

您可以使用pkey转换为 PKCS8 DER并返回PEM,其中genpkey处理多种算法并使用PKCS8:

openssl pkey -in key.pem [-inform PEM] -out key.der -outform DER 
openssl pkey -in key.der -inform DER -out xxx.pem [-outform PEM]
# now xxx.pem is the same as key.pem 

由于PEG文件(与DER不同)可以通过BEGIN行中的类型识别,因此您可以直接将PKCS1 PEM转换回PKCS8:

openssl pkey -in key2.pem -out yyy.pem 
# now yyy.pem is the same as key.pem 

使用OpenSSL库的程序(包括但不限于openssl命令行)可以自动读取这些格式的私钥PEM文件,如果提供了正确的密码,也可以自动读取两种加密格式中的任何一种。