Differenze tra “INIZIA CHIAVE PRIVATA RSA” e “INIZIA CHIAVE PRIVATA”


150

Ciao stavo scrivendo un programma che importa le chiavi private da un .pemfile e crea un oggetto chiave privata per usarlo in seguito .. il problema che ho riscontrato è che alcuni pemheader di file iniziano con

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

mentre altri iniziano con

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

attraverso la mia ricerca sapevo che i primi sono PKCS#8formattati ma non sapevo a quale formato appartiene l'altro.

Risposte:


183

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

BEGIN RSA PRIVATE KEYè PKCS # 1 ed è solo una chiave RSA. È essenzialmente solo l'oggetto 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 della chiave stessa. 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
}

Quindi, per una chiave privata RSA, l'OID è 1.2.840.113549.1.1.1 e esiste un RSAPrivateKey come stringa di bit di dati della chiave PrivateKey.

Al contrario BEGIN RSA PRIVATE KEY, che specifica sempre una chiave RSA e quindi non include un tipo di chiave OID. 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 termina 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 (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}

quindi, esiste un formato utilizzato tranne quei due, e se esiste come posso determinarlo dall'intestazione?
lunedì

1
Immagino che uno qualsiasi dei tag della chiave privata forniti nella risposta di Sonic sia un gioco equo.
Jason C,

Per le chiavi RSA, PKCS # 1 contiene parametri CRT, PKCS # 8 no. Puoi confermarlo guardando le taglie. PKCS # 8 è più piccolo anche con più intestazioni aggiunte. Se ti interessano le prestazioni, usa PKCS # 1. Il mio test mostra 3 volte più veloce.
ZZ Coder

5
@ZZCoder, potresti fornire alcuni dettagli su come hai generato le chiavi e testato le prestazioni? openssl genpkey -algorithm RSA -out key.pemgenera la chiave PKCS # 8 che include i parametri CRT.
Vadim Kuznetsov,

5
Per generare una chiave PKCS # 1 èopenssl genrsa possibile utilizzare il comando. L'uso openssl reqper generare sia la chiave privata che crt finirà con una chiave PKCS # 8 . Il genpkeymanuale afferma The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Ma alcuni software ( mysql) possono usare solo i tasti PKCS # 1 . La conversione da PKCS # 8 a PKCS # 1 può essere eseguita con openssl rsa -in key.pem -out key.pem. La conversione in altro modo può essere eseguita con openssl pkey -in key.pem -out key.pem.
Paul Tobias,

28

Dai un'occhiata <openssl/pem.h>. Fornisce possibili marcatori BEGIN.

Copia del contenuto dal link sopra per riferimento rapido:

#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"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.