Différences entre "BEGIN RSA PRIVATE KEY" et "BEGIN PRIVATE KEY"

152

Salut, j'écrivais un programme qui importe des clés privées à partir d'un .pemfichier et crée un objet clé privée pour l'utiliser plus tard .. le problème que j'ai rencontré est que certains pemen-têtes de fichiers commencent par

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

tandis que d'autres commencent par

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

grâce à ma recherche, je savais que les premiers étaient PKCS#8formatés, mais je ne pouvais pas savoir à quel format appartient l'autre.

monim
la source

Réponses:

184

Voir https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (recherchez sur la page "BEGIN RSA PRIVATE KEY") ( lien d'archive pour la postérité, juste au cas où).

BEGIN RSA PRIVATE KEYest PKCS # 1 et est juste une clé RSA. Il s'agit essentiellement de l'objet clé de PKCS # 8, mais sans la version ou l'identificateur d'algorithme en face. BEGIN PRIVATE KEYest PKCS # 8 et indique que le type de clé est inclus dans les données de clé elles-mêmes. Depuis le lien:

Les données codées PKCS # 8 non chiffrées commencent et se terminent par les balises:

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

Dans les données encodées en base64, la structure DER suivante est présente:

PrivateKeyInfo ::= SEQUENCE {
  version         Version,
  algorithm       AlgorithmIdentifier,
  PrivateKey      BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

Ainsi, pour une clé privée RSA, l'OID est 1.2.840.113549.1.1.1 et il existe une RSAPrivateKey comme chaîne de bits de données de clé PrivateKey.

Par opposition à BEGIN RSA PRIVATE KEY, qui spécifie toujours une clé RSA et n'inclut donc pas un OID de type clé. BEGIN RSA PRIVATE KEYest PKCS#1:

Fichier de clé privée RSA (PKCS # 1)

Le fichier PEM de clé privée RSA est spécifique aux clés RSA.

Il commence et se termine par les balises:

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

Dans les données encodées en base64, la structure DER suivante est présente:

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
}
Jason C
la source
Alors, y a-t-il un format utilisé à l'exception de ces deux, et s'il y en a, comment puis-je le déterminer à partir de l'en-tête?
lundi
1
J'imagine que toutes les clés privées données dans la réponse de Sonic sont équitables.
Jason C
Pour les clés RSA, PKCS # 1 contient des paramètres CRT, pas PKCS # 8. Vous pouvez le confirmer en regardant les tailles. PKCS # 8 est plus petit même avec plus d'en-têtes ajoutés. Si vous vous souciez des performances, utilisez PKCS # 1. Mon test montre 3 fois plus vite.
ZZ Coder
5
@ZZCoder, pourriez-vous s'il vous plaît fournir quelques détails sur la façon dont vous avez généré les clés et testé les performances? openssl genpkey -algorithm RSA -out key.pemgénère la clé PKCS # 8 qui inclut les paramètres CRT.
Vadim Kuznetsov
5
Pour générer une clé PKCS # 1, la openssl genrsacommande peut être utilisée. Utiliser openssl reqpour générer à la fois la clé privée et le crt se terminera par une clé PKCS # 8 . Le genpkeymanuel déclare The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Mais certains logiciels ( mysql) ne peuvent utiliser que les clés PKCS # 1 . La conversion de PKCS # 8 à PKCS # 1 peut être effectuée avec openssl rsa -in key.pem -out key.pem. La conversion dans l'autre sens peut être effectuée avec openssl pkey -in key.pem -out key.pem.
Paul Tobias
28

Jettes un coup d'oeil à <openssl/pem.h> . Il donne des marqueurs BEGIN possibles.

Copie du contenu à partir du lien ci-dessus pour une référence rapide:

#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"
vishnu viswanath
la source