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.

Author: jww, 2013-11-19

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
}
 117
Author: Jason C, 2014-11-06 19:34:56
Olha para isto.<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"
 13
Author: vishnu viswanath, 2018-09-07 04:44:40