Differenze tra “BEGIN RSA PRIVATE KEY” e “BEGIN PRIVATE KEY”

Ciao, stavo scrivendo un programma che importa le chiavi private da un file .pem e creo un object chiave privata per usarlo più tardi .. il problema che ho dovuto affrontare è che alcuni intestazione di file pem iniziano con

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

mentre altri iniziano con

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

attraverso la mia ricerca ho saputo che i primi sono formattati con PKCS#8 ma non potevo sapere a quale formato appartiene l’altro.

Vedi https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (cerca nella pagina “BEGIN RSA PRIVATE KEY”) ( link archivio per i posteri, per ogni evenienza).

BEGIN RSA PRIVATE KEY è PKCS # 1 ed è solo una chiave RSA. Essenzialmente è solo l’object chiave di PKCS # 8, ma senza la versione o l’identificatore dell’algoritmo in primo piano. BEGIN PRIVATE KEY è PKCS # 8 e indica che il tipo di chiave è incluso nei dati chiave stessi. Dal link:

I dati codificati PKCS # 8 non crittografati iniziano e terminano con i tag:

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

All’interno dei dati codificati base64 è presente la seguente struttura DER:

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

Pertanto, per una chiave privata RSA, l’OID è 1.2.840.113549.1.1.1 e vi è un RSAPrivateKey come stringa di dati chiave PrivateKey.

A differenza di BEGIN RSA PRIVATE KEY , che specifica sempre una chiave RSA e quindi non include un OID di tipo chiave. BEGIN RSA PRIVATE KEY è PKCS#1 :

File chiave privata RSA (PKCS # 1)

Il file PEM della chiave privata RSA è specifico per le chiavi RSA.

Inizia e finisce con i tag:

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

All’interno dei dati codificati base64 è presente la seguente struttura 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 } 

Dai un’occhiata a questo . Fornisce possibili indicatori BEGIN.

Copia del contenuto dal link precedente per una rapida consultazione:

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