Diferenças entre" BEGIN RSA PRIVATE KEY " e "BEGIN PRIVATE KEY"
Oi eu estava escrevendo um programa que importa chaves privadas de um arquivo .pem
e criar um objeto de chave privada para usá-lo mais tarde..
o problema que eu enfrentei é que alguns arquivos pem
cabeçalho começam com
-----BEGIN PRIVATE KEY-----
enquanto outros começam por
-----BEGIN RSA PRIVATE KEY-----
Através da minha pesquisa, eu sabia que os primeiros eram formatados, mas não sabia a que formato pertence o outro.
2 answers
Ver https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (procure na página "inicie a chave privada RSA") (link de Arquivo para a posteridade, só para o caso).
BEGIN RSA PRIVATE KEY
é PKCS#1 e é apenas uma chave RSA. É essencialmente apenas o objeto chave do PKCS#8, mas sem a versão ou identificador de algoritmo na frente. BEGIN PRIVATE KEY
é PKCS # 8 e indica que o tipo de chave está incluído nos próprios dados. A partir da ligação:
A os PCS#8 codificados não encriptados começam e terminam com as marcas:
-----BEGIN PRIVATE KEY----- BASE64 ENCODED DATA -----END PRIVATE KEY-----
Dentro dos dados codificados de base64 está presente a seguinte estrutura DER:
PrivateKeyInfo ::= SEQUENCE { version Version, algorithm AlgorithmIdentifier, PrivateKey BIT STRING } AlgorithmIdentifier ::= SEQUENCE { algorithm OBJECT IDENTIFIER, parameters ANY DEFINED BY algorithm OPTIONAL }
Assim, para uma chave privada RSA, o OID é 1.2.840.113549.1.1.1 e existe uma chave RSAPrivateKey como a chave PrivateKey dados bitstring.
Em oposição a BEGIN RSA PRIVATE KEY
, que especifica sempre uma chave RSA e, portanto, não inclui um tipo de chave OID. BEGIN RSA PRIVATE KEY
é PKCS#1
:
Ficheiro de chave privada RSA (PKCS#1)
O ficheiro PEM da chave privada RSA é específico para as chaves RSA.
Começa e termina com as etiquetas:
-----BEGIN RSA PRIVATE KEY----- BASE64 ENCODED DATA -----END RSA PRIVATE KEY-----
Dentro dos dados codificados de base64 está presente a seguinte estrutura 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>
. Dá possíveis marcas de início.
Copiar o conteúdo da ligação acima para uma referência rápida:
#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"