Perbedaan antara "BEGIN RSA PRIVATE KEY" dan "BEGIN PRIVATE KEY"

150

Hai Saya sedang menulis sebuah program yang mengimpor kunci pribadi dari .pemfile dan membuat objek kunci pribadi untuk menggunakannya nanti .. masalah yang saya hadapi adalah bahwa beberapa pemfile header dimulai dengan

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

sementara yang lain mulai dengan

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

melalui pencarian saya, saya tahu bahwa yang pertama PKCS#8diformat tetapi saya tidak tahu format apa yang dimiliki milik yang lain.

monim
sumber

Jawaban:

183

Lihat https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (cari halaman "BEGIN RSA PRIVATE KEY") ( tautan arsip untuk anak cucu, untuk berjaga-jaga).

BEGIN RSA PRIVATE KEYadalah PKCS # 1 dan hanya kunci RSA. Ini pada dasarnya hanya objek kunci dari PKCS # 8, tetapi tanpa pengenal versi atau algoritma di depan. BEGIN PRIVATE KEYadalah PKCS # 8 dan menunjukkan bahwa tipe kunci termasuk dalam data kunci itu sendiri. Dari tautan:

Data yang dikodekan PKCS # 8 yang tidak dienkripsi dimulai dan diakhiri dengan tag:

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

Di dalam data yang disandikan base64 struktur DER berikut hadir:

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

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

Jadi untuk kunci privat RSA, OID adalah 1.2.840.113549.1.1.1 dan ada RSAPrivateKey sebagai bitstring data kunci PrivateKey.

Berbeda dengan BEGIN RSA PRIVATE KEY, yang selalu menentukan kunci RSA dan karenanya tidak termasuk jenis kunci OID. BEGIN RSA PRIVATE KEYadalah PKCS#1:

File Kunci Pribadi RSA (PKCS # 1)

File PEM kunci pribadi RSA khusus untuk kunci RSA.

Dimulai dan diakhiri dengan tag:

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

Di dalam data yang disandikan base64 struktur DER berikut hadir:

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
sumber
jadi, apakah ada format yang digunakan kecuali keduanya, dan jika ada bagaimana saya bisa menentukannya dari header?
monim
1
Saya membayangkan salah satu tag kunci pribadi yang diberikan dalam jawaban sonic adalah permainan yang adil.
Jason C
Untuk kunci RSA, PKCS # 1 berisi parameter CRT, PKCS # 8 tidak. Anda dapat mengkonfirmasi ini dengan melihat ukuran. PKCS # 8 lebih kecil bahkan dengan lebih banyak header ditambahkan. Jika Anda peduli dengan kinerja, gunakan PKCS # 1. Tes saya menunjukkan 3 kali lebih cepat.
ZZ Coder
5
@ZZCoder, bisakah Anda memberikan beberapa detail tentang bagaimana Anda membuat kunci dan menguji kinerja? openssl genpkey -algorithm RSA -out key.pemmenghasilkan kunci PKCS # 8 yang tidak menyertakan parameter CRT.
Vadim Kuznetsov
5
Untuk menghasilkan kunci PKCS # 1openssl genrsa perintah dapat digunakan. Menggunakan openssl requntuk menghasilkan kunci pribadi dan crt akan berakhir dengan kunci PKCS # 8 . Status genpkeymanual The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Tetapi beberapa perangkat lunak ( mysql) hanya dapat menggunakan kunci PKCS # 1 . Konversi dari PKCS # 8 ke PKCS # 1 dapat dilakukan dengan openssl rsa -in key.pem -out key.pem. Mengubah cara lain bisa dilakukan openssl pkey -in key.pem -out key.pem.
Paul Tobias
28

Lihatlah <openssl/pem.h>. Ini memberi kemungkinan BEGIN marker.

Menyalin konten dari tautan di atas untuk referensi cepat:

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