java - "BEGIN RSA PRIVATE KEY" 和"BEGIN PRIVATE KEY" 之间的区别是什么

我在编写一个java程序,从.pem文件中导入私钥,并且创建一个私钥对象以便以后使用它。 我遇到的问题是一些pem文件头开头


-----BEGIN PRIVATE KEY-----

其他一些开头是


-----BEGIN RSA PRIVATE KEY-----

通过我的搜索,我知道第一个是PCKS#8格式的,但是,我不知道其他属于什么格式。

时间:

请参阅https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (搜索"开始rsa私钥"页")(存档链接,以防万一)。

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.113 549.1.1.1,并且有RSAPrivateKey作为PrivateKey密钥数据bitstring 。

BEGIN RSA PRIVATE KEY 它始终指定RSA密钥,因此不包括密钥类型OID ,BEGIN RSA PRIVATE KEYPKCS#1:

RSA私钥文件(PKCS#1 )

RSA私钥文件对于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 (p1)
 exponent2 INTEGER, -- d mod (q-1)
 coefficient INTEGER, -- (inverse of q) mod p
 otherPrimeInfos OtherPrimeInfos OPTIONAL
}

看一下这个 ,它提供了可能的开始标记。

从上面的链接复制内容以便快速引用:


#define PEM_STRING_X509_OLD "X509 CERTIFICATE"
#define PEM_STRING_X509 "CERTIFICATE"
#define PEM_STRING_X509_PAIR "CERTIFICATE PAIR"
#define PEM_STRING_X509_TRUSTED "TRUSTED CERTIFICATE"
#define PEM_STRING_X509_REQ_OLD "NEW CERTIFICATE REQUEST"
#define PEM_STRING_X509_REQ "CERTIFICATE REQUEST"
#define PEM_STRING_X509_CRL "X509 CRL"
#define PEM_STRING_EVP_PKEY "ANY PRIVATE KEY"
#define PEM_STRING_PUBLIC "PUBLIC KEY"
#define PEM_STRING_RSA "RSA PRIVATE KEY"
#define PEM_STRING_RSA_PUBLIC "RSA PUBLIC KEY"
#define PEM_STRING_DSA "DSA PRIVATE KEY"
#define PEM_STRING_DSA_PUBLIC "DSA PUBLIC KEY"
#define PEM_STRING_PKCS7 "PKCS7"
#define PEM_STRING_PKCS7_SIGNED "PKCS #7 SIGNED DATA"
#define PEM_STRING_PKCS8 "ENCRYPTED PRIVATE KEY"
#define PEM_STRING_PKCS8INF "PRIVATE KEY"
#define PEM_STRING_DHPARAMS "DH PARAMETERS"
#define PEM_STRING_DHXPARAMS "X9.42 DH PARAMETERS"
#define PEM_STRING_SSL_SESSION "SSL SESSION PARAMETERS"
#define PEM_STRING_DSAPARAMS "DSA PARAMETERS"
#define PEM_STRING_ECDSA_PUBLIC "ECDSA PUBLIC KEY"
#define PEM_STRING_ECPARAMETERS "EC PARAMETERS"
#define PEM_STRING_ECPRIVATEKEY "EC PRIVATE KEY"
#define PEM_STRING_PARAMETERS "PARAMETERS"
#define PEM_STRING_CMS "CMS"

...