Mi respuesta a continuación es un poco larga, pero espero que brinde algunos detalles que faltan en las respuestas anteriores. Comenzaré con algunas declaraciones relacionadas y finalmente responderé la pregunta inicial.
Para cifrar algo utilizando el algoritmo RSA, necesita un par de exponente de módulo y cifrado (público) (n, e). Esa es tu clave pública. Para descifrar algo utilizando el algoritmo RSA, necesita un par de exponentes de módulo y descifrado (privado) (n, d). Esa es tu clave privada.
Para cifrar algo usando la clave pública RSA, trata su texto sin formato como un número y lo eleva a la potencia del módulo n:
ciphertext = ( plaintext^e ) mod n
Para descifrar algo utilizando la clave privada RSA, trata el texto cifrado como un número y lo eleva a la potencia del módulo d n:
plaintext = ( ciphertext^d ) mod n
Para generar una clave privada (d, n) usando openssl puede usar el siguiente comando:
openssl genrsa -out private.pem 1024
Para generar una clave pública (e, n) a partir de la clave privada usando openssl, puede usar el siguiente comando:
openssl rsa -in private.pem -out public.pem -pubout
Para analizar el contenido de la clave privada RSA private.pem generada por el comando openssl anterior, ejecute lo siguiente (salida truncada en las etiquetas aquí):
openssl rsa -in private.pem -text -noout | less
modulus - n
privateExponent - d
publicExponent - e
prime1 - p
prime2 - q
exponent1 - d mod (p-1)
exponent2 - d mod (q-1)
coefficient - (q^-1) mod p
¿No debería la clave privada consistir solo en (n, d) par? ¿Por qué hay 6 componentes adicionales? Contiene e (exponente público) para que la clave RSA pública se pueda generar / extraer / derivar de la clave privada RSA private.pem. Los 5 componentes restantes están ahí para acelerar el proceso de descifrado. Resulta que al precalcular y almacenar esos 5 valores es posible acelerar el descifrado RSA por el factor 4. El descifrado funcionará sin esos 5 componentes, pero se puede hacer más rápido si los tiene a mano. El algoritmo de aceleración se basa en el teorema del resto chino .
Sí, la clave privada private.pem RSA en realidad contiene todos esos 8 valores; ninguno de ellos se genera sobre la marcha cuando ejecuta el comando anterior. Intente ejecutar los siguientes comandos y compare la salida:
# Convert the key from PEM to DER (binary) format
openssl rsa -in private.pem -outform der -out private.der
# Print private.der private key contents as binary stream
xxd -p private.der
# Now compare the output of the above command with output
# of the earlier openssl command that outputs private key
# components. If you stare at both outputs long enough
# you should be able to confirm that all components are
# indeed lurking somewhere in the binary stream
openssl rsa -in private.pem -text -noout | less
El PKCS # 1 v1.5 recomienda esta estructura de la clave privada RSA como una representación alternativa ( segunda ). El estándar PKCS # 1 v2.0 excluye los exponentes eyd de la representación alternativa por completo. PKCS # 1 v2.1 y v2.2 proponen más cambios a la representación alternativa, al incluir opcionalmente más componentes relacionados con CRT.
Para ver el contenido de la clave pública RSA public.pem, ejecute lo siguiente (salida truncada a etiquetas aquí):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
No hay sorpresas aquí. Es solo (n, e) par, como se prometió.
Ahora, finalmente, respondo a la pregunta inicial: como se mostró anteriormente, la clave RSA privada generada con openssl contiene componentes de claves públicas y privadas y algunos más. Cuando genera / extrae / deriva la clave pública de la clave privada, openssl copia dos de esos componentes (e, n) en un archivo separado que se convierte en su clave pública.