在进行RSA签名或加密的时候,我们经常看到有2种形式开头密钥文件(PEM格式):“BEGIN RSA PRIVATE KEY”和“BEGIN PRIVATE KEY”, 那么这两种格式的密钥有什么区别呢?
BEGIN RSA PRIVATE KEY
是 PKCS#1,只是一个 RSA 密钥。它本质上只是 PKCS#8 中的密钥对象,但前面没有版本或算法标识符。
BEGIN PRIVATE KEY
是 PKCS#8,表示密钥类型包含在密钥数据本身中。从链接:
未加密的 PKCS#8 编码数据以标签开头和结尾:
-----BEGIN PRIVATE KEY-----
BASE64 ENCODED DATA
-----END PRIVATE KEY-----
在 base64 编码数据中,存在以下 DER 结构:
PrivateKeyInfo ::= SEQUENCE {
version Version,
algorithm AlgorithmIdentifier,
PrivateKey BIT STRING
AlgorithmIdentifier ::= SEQUENCE {
algorithm OBJECT IDENTIFIER,
parameters ANY DEFINED BY algorithm OPTIONAL
所以对于 RSA 私钥,OID 是 1.2.840.113549.1.1.1 并且有一个 RSAPrivateKey 作为 PrivateKey 密钥数据位串。
与BEGIN RSA PRIVATE KEY, 它始终指定 RSA 密钥相反,因此不包含密钥类型 OID。BEGIN RSA PRIVATE KEY是PKCS#1:
RSA 私钥文件(PKCS#1)
RSA 私钥 PEM 文件特定于 RSA 密钥。
它以标签开头和结尾:
-----BEGIN RSA PRIVATE KEY-----
BASE64 ENCODED DATA
-----END RSA PRIVATE KEY-----
在 base64 编码数据中,存在以下 DER 结构:
RSAPrivateKey ::= SEQUENCE {
version Version,
modulus INTEGER, -- n
publicExponent INTEGER, -- e
privateExponent INTEGER, -- d
prime1 INTEGER, -- p
prime2 INTEGER, -- q
exponent1 INTEGER, -- d mod (p-1)
exponent2 INTEGER, -- d mod (q-1)
coefficient INTEGER, -- (inverse of q) mod p
otherPrimeInfos OtherPrimeInfos OPTIONAL
所以对于 RSA 私钥,OID 是 1.2.840.113549.1.1.1 并且有一个 RSAPrivateKey 作为 PrivateKey 密钥数据位串。是 PKCS#1,只是一个 RSA 密钥。它本质上只是 PKCS#8 中的密钥对象,但前面没有版本或算法标识符。, 它始终指定 RSA 密钥相反,因此不包含密钥类型 OID。是 PKCS#8,表示密钥类型包含在密钥数据本身中。RSA 私钥 PEM 文件特定于 RSA 密钥。