Различия между "begin RSA секретный ключ" и "Начать приватный ключ"
Привет я писал программу, которая импортирует закрытые ключи из .pem
файл и создать объект закрытого ключа, чтобы использовать его позже..
проблема, с которой я столкнулся, заключается в том, что некоторые pem
заголовки файлов начинаются с
-----BEGIN PRIVATE KEY-----
в то время как другие начинаются с
-----BEGIN RSA PRIVATE KEY-----
через мой поиск я знал, что первые из них PKCS#8
форматированный, но я не мог знать, к какому формату принадлежит другой.
2 ответа:
см.https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (найдите на странице "начать закрытый ключ RSA") (ссылка на архив для потомков, на всякий случай).
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 присутствует следующая структура 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 Private Key file (PKCS#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 (p1) exponent2 INTEGER, -- d mod (q-1) coefficient INTEGER, -- (inverse of q) mod p otherPrimeInfos OtherPrimeInfos OPTIONAL }
посмотреть
<openssl/pem.h>
. Это дает возможность начать маркеры.копирование содержимого из приведенной выше ссылки для быстрого ознакомления:
#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"