2013-11-19 5 views
79

Привет, я писал программу, которая импортирует секретные ключи из файла .pem и создает объект закрытого ключа, чтобы использовать его позже. проблема, с которой я столкнулся, - это что некоторые pem файлов заголовки начинаются сРазличия между «BEGIN RSA PRIVATE KEY» и «BEGIN PRIVATE KEY»

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

в то время как другие начинают с

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

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

ответ

98

См. https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (поиск по разделу «НАЧАЛЬНЫЙ КЛЮЧ KEY») (archive link для потомков, на всякий случай).

BEGIN RSA PRIVATE KEY является PKCS # 1 и является только ключом RSA. Это, по сути, только ключевой объект из PKCS # 8, но без указателя версии или алгоритма спереди. BEGIN PRIVATE KEY - это PKCS # 8 и указывает, что тип ключа включен в данные ключа. Из ссылки:

незашифрованного PKCS # 8 кодированных запусков данных и заканчивается с тегами:

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

В base64 кодированных данных следующая структура МЭДА присутствует:

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, и в качестве строковой строки данных ключа KeyKey есть RSAPrivateKey.

В отличие от BEGIN RSA PRIVATE KEY, который всегда указывает ключ RSA и, следовательно, не включает идентификатор типа ключа. BEGIN RSA PRIVATE KEY является PKCS#1:

RSA Private Key файл (PKCS # 1)

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

Она начинается и заканчивается с тегами:

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

В base64 кодированные данные следующую структуру МЭД присутствует:

RSAPrivateKey ::= SEQUENCE { 
    version   Version, 
    modulus   INTEGER, -- n 
    publicExponent INTEGER, -- e 
    privateExponent INTEGER, -- d 
    prime1   INTEGER, -- p 
    prime2   INTEGER, -- q 
    exponent1   INTEGER, -- d mod (p1) 
    exponent2   INTEGER, -- d mod (q-1) 
    coefficient  INTEGER, -- (inverse of q) mod p 
    otherPrimeInfos OtherPrimeInfos OPTIONAL 
} 
+0

так, является ли какой-либо формат, который используется, кроме этих двух, и если есть, как я могу определить его из заголовка? – monim

+0

Я бы предположил, что любые секретные ключевые теги, заданные в ответе звукового сигнала, - это честная игра. –

+0

Для ключей RSA PKCS # 1 содержит параметры CRT, PKCS # 8 - нет. Вы можете подтвердить это, посмотрев размеры. PKCS # 8 меньше даже при добавлении большего количества заголовков. Если вам нужна производительность, используйте PKCS # 1. Мой тест показывает в 3 раза быстрее. –

13

Посмотрите this. Он дает возможные маркеры 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" 
Смежные вопросы