在进行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 }