Unterschiede zwischen "BEGIN RSA PRIVATE KEY" und "BEGIN PRIVATE KEY"

150

Hallo, ich habe ein Programm geschrieben, das private Schlüssel aus einer .pemDatei importiert und ein privates Schlüsselobjekt erstellt, um es später zu verwenden. Das Problem, mit dem ich konfrontiert bin, ist, dass einige pemDateikopfzeilen mit beginnen

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

während andere mit beginnen

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

Durch meine Suche wusste ich, dass die ersten PKCS#8formatiert sind, aber ich konnte nicht wissen, zu welchem ​​Format das andere gehört.

monim
quelle

Antworten:

183

Siehe https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (Suche die Seite für "BEGIN RSA PRIVATE KEY") ( Archiv - Link für die Nachwelt, nur für den Fall).

BEGIN RSA PRIVATE KEYist PKCS # 1 und ist nur ein RSA-Schlüssel. Es ist im Wesentlichen nur das Schlüsselobjekt von PKCS # 8, jedoch ohne die Versions- oder Algorithmuskennung vor. BEGIN PRIVATE KEYist PKCS # 8 und zeigt an, dass der Schlüsseltyp in den Schlüsseldaten selbst enthalten ist. Über den Link:

Die unverschlüsselten PKCS # 8-codierten Daten beginnen und enden mit den Tags:

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

Innerhalb der base64-codierten Daten ist die folgende DER-Struktur vorhanden:

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

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

Für einen privaten RSA-Schlüssel lautet die OID 1.2.840.113549.1.1.1, und es gibt einen RSAPrivateKey als PrivateKey-Schlüsseldaten-Bitstring.

Im Gegensatz zu BEGIN RSA PRIVATE KEY, das immer einen RSA-Schlüssel angibt und daher keine Schlüsseltyp-OID enthält. BEGIN RSA PRIVATE KEYist PKCS#1:

RSA Private Key-Datei (PKCS # 1)

Die PEM-Datei für private RSA-Schlüssel ist spezifisch für RSA-Schlüssel.

Es beginnt und endet mit den Tags:

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

Innerhalb der base64-codierten Daten ist die folgende DER-Struktur vorhanden:

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.
quelle
Gibt es also ein anderes Format als diese beiden, und wenn ja, wie kann ich es anhand des Headers ermitteln?
Monim
1
Ich würde mir vorstellen, dass alle privaten Schlüssel-Tags in Sonics Antwort ein faires Spiel sind.
Jason C
Bei RSA-Schlüsseln enthält PKCS # 1 CRT-Parameter, PKCS # 8 nicht. Sie können dies anhand der Größen bestätigen. PKCS # 8 ist kleiner, auch wenn mehr Header hinzugefügt werden. Wenn Sie Wert auf Leistung legen, verwenden Sie PKCS # 1. Mein Test zeigt 3 mal schneller.
ZZ Coder
5
@ZZCoder, können Sie bitte einige Details dazu angeben, wie Sie die Schlüssel generiert und die Leistung getestet haben? openssl genpkey -algorithm RSA -out key.pemgeneriert den PKCS # 8-Schlüssel, der die CRT-Parameter enthält.
Vadim Kuznetsov
5
Um einen PKCS # 1- Schlüssel zu generieren, openssl genrsakann der Befehl verwendet werden. Wenn Sie openssl reqsowohl den privaten Schlüssel als auch den CRT generieren, erhalten Sie einen PKCS # 8- Schlüssel. Das genpkeyHandbuch besagt The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Einige Software ( mysql) können jedoch nur PKCS # 1- Schlüssel verwenden. Die Konvertierung von PKCS # 8 zu PKCS # 1 kann mit erfolgen openssl rsa -in key.pem -out key.pem. Das Konvertieren in die andere Richtung kann mit erfolgen openssl pkey -in key.pem -out key.pem.
Paul Tobias
28

Schau es dir an <openssl/pem.h>. Es gibt mögliche BEGIN-Marker.

Kopieren des Inhalts über den obigen Link zur schnellen Referenz:

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