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

Openssl RSA密钥PEM和DER转换-不匹配,openssl,rsa,Openssl,Rsa,我正在研究openssl和RSA密钥生成和操作。首先,我生成了一个以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

我正在研究openssl和RSA密钥生成和操作。首先,我生成了一个以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
为什么呢?我做错什么了吗

所有的钥匙都附在这里。

谢谢,
Difan

查看PEM文件,您将看到一个文件以
----开始私钥------
开头,另一个文件以
----开始RSA私钥------
开头。PEM块的开始行和结束行中的字指定块中数据的格式,这些字指定OpenSSL为RSA密钥支持的大约10种不同数据格式中的两种(具体取决于您的计数方式)

第一个是第5节PKCS8的未加密变体。PKCS8可以处理许多不同算法的私钥,包括RSA DSA DH和ECDSA,无论是否使用基于密码的密钥加密(PBE)
openssl genpkey
设计用于处理多种算法,并使用PKCS8格式来处理

第二个是第A.1节中PKCS1的RSA onlyprivatekey语法。此格式由较旧的
openssl rsa
openssl genrsa
函数编写,因为它们只处理rsa,因此被称为“传统”或“传统”格式,以区别于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 
由于PEM文件(与DER不同)可以通过开始行中的类型识别,因此可以直接将PKCS1 PEM转换回PKCS8:

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

使用OpenSSL库的程序(包括但不限于
OpenSSL
commandline)可以自动读取这些格式中的任意一种格式的privatekey PEM文件,如果提供了正确的密码,还可以自动读取两种加密格式中的任意一种

谢谢你,先生!答案很清楚。我投了更高的票,但很明显,我是一个名声不好的新手,所以我的得票不算数。。。很抱歉但这个答案应该会吸引一些选票!