Diferencias entre "BEGIN RSA PRIVATE KEY" y "BEGIN PRIVATE KEY"

150

Hola, estaba escribiendo un programa que importa claves privadas de un .pemarchivo y crea un objeto de clave privada para usarlo más tarde ... el problema que he enfrentado es que algunospem encabezado de archivos comienza con

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

mientras que otros comienzan con

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

A través de mi búsqueda supe que los primeros están PKCS#8formateados, pero no podía saber a qué formato pertenece el otro.

monim
fuente

Respuestas:

183

Consulte https://polarssl.org/kb/cryptography/asn1-key-structures-in-der-and-pem (busque en la página "BEGIN RSA PRIVATE KEY") ( enlace de archivo para la posteridad, por si acaso).

BEGIN RSA PRIVATE KEYes PKCS # 1 y es solo una clave RSA. Esencialmente es solo el objeto clave de PKCS # 8, pero sin la versión o el identificador de algoritmo al frente. BEGIN PRIVATE KEYes PKCS # 8 e indica que el tipo de clave está incluido en los datos de clave en sí. Desde el enlace:

Los datos codificados PKCS # 8 sin cifrar comienzan y terminan con las etiquetas:

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

Dentro de los datos codificados en base64 está presente la siguiente estructura DER:

PrivateKeyInfo ::= SEQUENCE {
  version         Version,
  algorithm       AlgorithmIdentifier,
  PrivateKey      BIT STRING
}

AlgorithmIdentifier ::= SEQUENCE {
  algorithm       OBJECT IDENTIFIER,
  parameters      ANY DEFINED BY algorithm OPTIONAL
}

Entonces, para una clave privada RSA, el OID es 1.2.840.113549.1.1.1 y hay una RSAPrivateKey como la cadena de bits de datos de la clave PrivateKey.

A diferencia de BEGIN RSA PRIVATE KEY, que siempre especifica una clave RSA y, por lo tanto, no incluye un tipo de clave OID. BEGIN RSA PRIVATE KEYes PKCS#1:

Archivo de clave privada RSA (PKCS # 1)

El archivo PEM de clave privada RSA es específico para claves RSA.

Comienza y termina con las etiquetas:

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

Dentro de los datos codificados en base64 está presente la siguiente estructura DER:

RSAPrivateKey ::= SEQUENCE {
  version           Version,
  modulus           INTEGER,  -- n
  publicExponent    INTEGER,  -- e
  privateExponent   INTEGER,  -- d
  prime1            INTEGER,  -- p
  prime2            INTEGER,  -- q
  exponent1         INTEGER,  -- d mod (p-1)
  exponent2         INTEGER,  -- d mod (q-1)
  coefficient       INTEGER,  -- (inverse of q) mod p
  otherPrimeInfos   OtherPrimeInfos OPTIONAL
}
Jason C
fuente
entonces, ¿hay algún formato que se use, excepto esos dos, y si es así, cómo puedo determinarlo desde el encabezado?
monim
1
Me imagino que cualquiera de las etiquetas de clave privada dadas en la respuesta de sonic es un juego justo.
Jason C
Para las claves RSA, PKCS # 1 contiene parámetros CRT, PKCS # 8 no. Puede confirmar esto mirando los tamaños. PKCS # 8 es más pequeño incluso con más encabezados agregados. Si le importa el rendimiento, use PKCS # 1. Mi prueba muestra 3 veces más rápido.
ZZ Coder
55
@ZZCoder, ¿podría proporcionar algunos detalles sobre cómo generó las claves y probó el rendimiento? openssl genpkey -algorithm RSA -out key.pemgenera la clave PKCS # 8 que incluye los parámetros CRT.
Vadim Kuznetsov
55
Para generar una clave PKCS # 1,openssl genrsa se puede usar el comando. El uso openssl reqpara generar tanto la clave privada como la crt terminará con una clave PKCS # 8 . El genpkeymanual dice The use of the genpkey program is encouraged over the algorithm specific utilities because additional algorithm options and ENGINE provided algorithms can be used.. Pero algunos software ( mysql) solo pueden usar claves PKCS # 1 . La conversión de PKCS # 8 a PKCS # 1 se puede hacer con openssl rsa -in key.pem -out key.pem. La conversión de la otra manera se puede hacer con openssl pkey -in key.pem -out key.pem.
Paul Tobias
28

Echa un vistazo a <openssl/pem.h>. Da posibles marcadores de COMIENZO.

Copiando el contenido del enlace de arriba para referencia 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"
vishnu viswanath
fuente