Różnice między „BEGIN RSA PRIVATE KEY” a „BEGIN PRIVATE KEY”

150

Cześć, pisałem program, który importuje klucze prywatne z .pempliku i tworzy obiekt klucza prywatnego do późniejszego wykorzystania .. Problem, z którym się spotkałem, polega na tym, że niektóre pemnagłówki plików zaczynają się od

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

podczas gdy inni zaczynają

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

podczas wyszukiwania wiedziałem, że pierwsze z nich są PKCS#8sformatowane, ale nie mogłem wiedzieć, do jakiego formatu należy ten drugi.

monim
źródło

Odpowiedzi:

183

Zobacz https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (wyszukaj na stronie „BEGIN RSA PRIVATE KEY”) ( link do archiwum dla potomnych, na wszelki wypadek).

BEGIN RSA PRIVATE KEYto PKCS # 1 i jest to tylko klucz RSA. Zasadniczo jest to tylko kluczowy obiekt z PKCS # 8, ale bez identyfikatora wersji lub algorytmu na początku. BEGIN PRIVATE KEYto PKCS # 8 i wskazuje, że typ klucza jest zawarty w samych danych klucza. Z linku:

Niezaszyfrowane dane zakodowane w formacie PKCS # 8 zaczynają się i kończą tagami:

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

W danych zakodowanych algorytmem base64 występuje następująca struktura DER:

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

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

Tak więc dla klucza prywatnego RSA OID to 1.2.840.113549.1.1.1, a jako ciąg danych klucza PrivateKey jest RSAPrivateKey.

W przeciwieństwie do BEGIN RSA PRIVATE KEY, który zawsze określa klucz RSA i dlatego nie zawiera klucza OID. BEGIN RSA PRIVATE KEYjest PKCS#1:

Plik klucza prywatnego RSA (PKCS # 1)

Plik PEM klucza prywatnego RSA jest specyficzny dla kluczy RSA.

Rozpoczyna się i kończy tagami:

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

W danych zakodowanych algorytmem base64 występuje następująca struktura 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
}
Jason C
źródło
więc czy istnieje jakiś format, który jest używany oprócz tych dwóch, a jeśli istnieje, jak mogę go określić na podstawie nagłówka?
poniedziałek
1
Wyobrażam sobie, że każdy z kluczy prywatnych podanych w odpowiedzi Sonic jest uczciwą grą.
Jason C
W przypadku kluczy RSA PKCS # 1 zawiera parametry CRT, a PKCS # 8 nie. Możesz to potwierdzić, patrząc na rozmiary. PKCS # 8 jest mniejszy nawet po dodaniu większej liczby nagłówków. Jeśli zależy Ci na wydajności, użyj PKCS # 1. Mój test pokazuje 3 razy szybciej.
ZZ Coder,
5
@ZZCoder, czy możesz podać szczegółowe informacje na temat sposobu generowania kluczy i testowania wydajności? openssl genpkey -algorithm RSA -out key.pemgeneruje klucz PKCS # 8, który zawiera parametry CRT.
Vadim Kuznetsov
5
Aby wygenerować klucz PKCS # 1,openssl genrsa można użyć polecenia. Użycie openssl reqdo wygenerowania zarówno klucza prywatnego, jak i crt zakończy się kluczem PKCS # 8 . Te genpkeystany manualne The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Jednak niektóre programy ( mysql) mogą używać tylko kluczy PKCS # 1 . Konwersję z PKCS # 8 do PKCS # 1 można wykonać za pomocą openssl rsa -in key.pem -out key.pem. Konwersję w drugą stronę można wykonać za pomocą openssl pkey -in key.pem -out key.pem.
Paul Tobias,
28

Spójrz na <openssl/pem.h>. Daje możliwe markery BEGIN.

Kopiowanie treści z powyższego linku do szybkiego odniesienia:

#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
źródło