Sự khác nhau giữa KEY BEGIN RSA PRIVATE KEY


150

Xin chào Tôi đã viết một chương trình nhập khóa riêng từ .pemtệp và tạo đối tượng khóa riêng để sử dụng sau .. vấn đề tôi gặp phải là một số pemtiêu đề tệp bắt đầu bằng

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

trong khi những người khác bắt đầu với

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

thông qua tìm kiếm của tôi, tôi biết rằng những cái đầu tiên được PKCS#8định dạng nhưng tôi không thể biết định dạng khác thuộc về định dạng nào.

Câu trả lời:


183

Xem https://pologistssl.org/kb/cryptography/asn1-key-strucenses-in-der-and-pem (tìm kiếm trang "BEGIN RSA PRIVATE KEY") ( liên kết lưu trữ cho hậu thế, chỉ trong trường hợp).

BEGIN RSA PRIVATE KEYlà PKCS # 1 và chỉ là khóa RSA. Nó thực chất chỉ là đối tượng chính từ PKCS # 8, nhưng không có phiên bản hoặc mã định danh thuật toán ở phía trước. BEGIN PRIVATE KEYlà PKCS # 8 và chỉ ra rằng loại khóa được bao gồm trong chính dữ liệu chính. Từ liên kết:

Dữ liệu được mã hóa PKCS # 8 không được mã hóa bắt đầu và kết thúc bằng các thẻ:

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

Trong dữ liệu được mã hóa base64, cấu trúc DER sau đây có mặt:

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

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

Vì vậy, đối với khóa riêng RSA, OID là 1.2.840.113549.1.1.1 và có RSAPrivateKey làm chuỗi bit dữ liệu của khóa PrivateKey.

Trái ngược với BEGIN RSA PRIVATE KEY, luôn chỉ định khóa RSA và do đó không bao gồm loại khóa OID. BEGIN RSA PRIVATE KEYPKCS#1:

Tệp khóa riêng RSA (PKCS # 1)

Tệp PEM của khóa riêng RSA dành riêng cho các khóa RSA.

Nó bắt đầu và kết thúc với các thẻ:

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

Trong dữ liệu được mã hóa base64, cấu trúc DER sau đây có mặt:

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
}

vì vậy, có bất kỳ định dạng nào được sử dụng ngoại trừ hai định dạng đó không và nếu có cách nào tôi có thể xác định nó từ tiêu đề?
monim

1
Tôi tưởng tượng bất kỳ thẻ khóa riêng nào được đưa ra trong câu trả lời của sonic là trò chơi công bằng.
Jason C

Đối với khóa RSA, PKCS # 1 chứa tham số CRT, PKCS # 8 thì không. Bạn có thể xác nhận điều này bằng cách nhìn vào kích cỡ. PKCS # 8 nhỏ hơn ngay cả khi có thêm tiêu đề. Nếu bạn quan tâm đến hiệu suất, hãy sử dụng PKCS # 1. Thử nghiệm của tôi cho thấy nhanh hơn 3 lần.
ZZ

5
@ZZCoder, bạn có thể vui lòng cung cấp một số chi tiết về cách bạn tạo các khóa và kiểm tra hiệu suất không? openssl genpkey -algorithm RSA -out key.pemtạo khóa PKCS # 8 bao gồm các tham số CRT.
Vadim Kuznetsov

5
Để tạo khóa PKCS # 1 , openssl genrsalệnh có thể được sử dụng. Sử dụng openssl reqđể tạo cả khóa riêng và crt sẽ kết thúc bằng khóa PKCS # 8 . Các genpkeytrạng thái thủ công The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Nhưng một số phần mềm ( mysql) chỉ có thể sử dụng các phím PKCS # 1 . Chuyển đổi từ PKCS # 8 sang PKCS # 1 có thể được thực hiện với openssl rsa -in key.pem -out key.pem. Chuyển đổi theo cách khác có thể được thực hiện với openssl pkey -in key.pem -out key.pem.
Paul Tobias

28

Có một cái nhìn vào <openssl/pem.h>. Nó cung cấp cho các dấu BEGIN có thể.

Sao chép nội dung từ liên kết trên để tham khảo nhanh:

#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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.