Відмінності між "НАЧАЛОМ РОБОЧОГО КЛЮЧА РСА" та "НАЧАЙТЕ ПРИВАТНИЙ КЛЮЧ"


150

Привіт, я писав програму, яка імпортує приватні ключі з .pemфайлу і створює об'єкт приватного ключа, щоб потім використовувати його .. Проблема, з якою я стикався, полягає в тому, що деякі pemзаголовки файлів починаються з

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

а інші починаються з

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

Під час мого пошуку я знав, що перші PKCS#8формати, але я не міг знати, до якого формату належить другий.

Відповіді:


183

Дивіться https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (пошукайте на сторінці "ПОЧАТИ КЛЮЧ ДЛЯ ПРАВИ RSA") ( архів посилання для нащадків, про всяк випадок).

BEGIN RSA PRIVATE KEYPKCS №1 і є лише ключем RSA. Це по суті лише ключовий об'єкт PKCS № 8, але без ідентифікатора версії чи алгоритму попереду. BEGIN PRIVATE KEYє PKCS # 8 і вказує на те, що тип ключа включений у самі ключові дані. За посиланням:

Нешифровані кодовані дані PKCS № 8 починаються та закінчуються тегами:

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

У кодованих даних base64 присутня така структура DER:

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

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

Таким чином, для приватного ключа RSA OID дорівнює 1.2.840.113549.1.1.1, і RSAPrivateKey є біт-рядком даних PrivateKey.

На відміну від BEGIN RSA PRIVATE KEY, який завжди вказує ключ RSA і тому не включає тип ключа OID. BEGIN RSA PRIVATE KEYє PKCS#1:

Файл приватного ключа RSA (ПКС №1)

Файл PEM приватного ключа RSA специфічний для ключів RSA.

Він починається і закінчується тегами:

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

У кодованих даних base64 присутня така структура 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
}

Отже, чи існує якийсь формат, окрім цих двох, і якщо є, як я можу визначити його із заголовка?
монім

1
Я б міг уявити, що будь-які теги приватних ключів, що даються у відповіді Sonic, - це чесна гра.
Джейсон C

Для ключів RSA PKCS №1 містить параметри CRT, PKCS # 8 - не. Ви можете підтвердити це, переглянувши розміри. PKCS № 8 є меншим, навіть якщо додано більше заголовків. Якщо ви дбаєте про продуктивність, використовуйте PKCS №1. Мій тест показує в 3 рази швидше.
ZZ Coder

5
@ZZCoder, будь ласка, будь ласка, надайте детальну інформацію про те, як ви генерували ключі та перевіряли продуктивність? openssl genpkey -algorithm RSA -out key.pemгенерує ключ PKCS # 8, який включає параметри CRT.
Вадим Кузнєцов

5
Для генерації ключа PKCS №1openssl genrsa команда може бути використана. Використовуючи openssl reqдля генерування як приватного ключа, так і crt, ви отримаєте ключ PKCS # 8 . У genpkeyпосібнику зазначено The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Але деякі програми ( mysql) можуть використовувати лише клавіші PKCS №1 . Перетворення з PKCS №8 в PKCS №1 можна здійснити за допомогою openssl rsa -in key.pem -out key.pem. Іншим способом можна перетворити інший спосіб openssl pkey -in key.pem -out key.pem.
Пол Тобіас

28

Погляньте <openssl/pem.h>. Це дає можливі маркери BEGIN.

Скопіюйте вміст із наведеного вище посилання для швидкого ознайомлення:

#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"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.