Differences between “BEGIN RSA PRIVATE KEY” and “BEGIN PRIVATE KEY”

匿名 (未验证) 提交于 2019-12-03 02:11:02

问题:

Hi I was writing a program that imports private keys from a .pem file and create a private key object to use it later.. the problem I have faced is that some pem files header begin with

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

while others begin with

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

through my search I knew that the first ones are PKCS#8 formatted but I couldn't know what format does the other one belongs to.

回答1:

See https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (search the page for "BEGIN RSA PRIVATE KEY") (archive link for posterity, just in case).

BEGIN RSA PRIVATE KEY is PKCS#1 and is just an RSA key. It is essentially just the key object from PKCS#8, but without the version or algorithm identifier in front. BEGIN PRIVATE KEY is PKCS#8 and indicates that the key type is included in the key data itself. From the link:

The unencrypted PKCS#8 encoded data starts and ends with the tags:

-----BEGIN PRIVATE KEY----- BASE64 ENCODED DATA -----END PRIVATE KEY----- 

Within the base64 encoded data the following DER structure is present:

PrivateKeyInfo ::= SEQUENCE {   version         Version,   algorithm       AlgorithmIdentifier,   PrivateKey      BIT STRING }  AlgorithmIdentifier ::= SEQUENCE {   algorithm       OBJECT IDENTIFIER,   parameters      ANY DEFINED BY algorithm OPTIONAL } 

So for an RSA private key, the OID is 1.2.840.113549.1.1.1 and there is a RSAPrivateKey as the PrivateKey key data bitstring.

As opposed to BEGIN RSA PRIVATE KEY, which always specifies an RSA key and therefore doesn't include a key type OID. BEGIN RSA PRIVATE KEY is PKCS#1:

RSA Private Key file (PKCS#1)

The RSA private key PEM file is specific for RSA keys.

It starts and ends with the tags:

-----BEGIN RSA PRIVATE KEY----- BASE64 ENCODED DATA -----END RSA PRIVATE KEY----- 

Within the base64 encoded data the following DER structure is present:

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 } 


回答2:

Have a look at this. It gives possible BEGIN markers.

Copying the content from the above link for quick reference:

#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" 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!