Различия между "BEGIN RSA PRIVATE KEY" и "НАЧАТЬ ЧАСТНЫЙ КЛЮЧ"
Привет. Я писал программу, которая импортирует секретные ключи из файла .pem
и создает закрытый ключ, чтобы использовать его позже.
проблема, с которой я столкнулся, заключается в том, что некоторые заголовки файлов pem
начинаются с
-----BEGIN PRIVATE KEY-----
в то время как другие начинаются с
-----BEGIN RSA PRIVATE KEY-----
через мой поиск Я знал, что первые из них PKCS#8
отформатированы, но я не мог знать, к какому формату принадлежит другой.
Ответы
Ответ 1
Смотрите https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (найдите страницу "BEGIN RSA PRIVATE KEY" ) (ссылка на архив для потомков, на всякий случай).
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, и в качестве строковой строки ключа данных PrivateKey есть RSAPrivateKey.
В отличие от BEGIN RSA PRIVATE KEY
, который всегда указывает ключ RSA и поэтому не включает OID ключа. BEGIN RSA PRIVATE KEY
PKCS#1
:
Файл секретного ключа RSA (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
}
Ответ 2
Посмотрите . Он дает возможные маркеры 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"