openssl - donde - ¿Usar clave privada RSA para generar clave pública?
rsa criptografia asimetrica (8)
Personas que buscan la clave pública SSH ...
Si está buscando extraer la clave pública para usarla con OpenSSH, necesitará obtener la clave pública de manera un poco diferente
$ ssh-keygen -y -f mykey.pem > mykey.pub
Este formato de clave pública es compatible con OpenSSH. Agregue la clave pública a remote:~/.ssh/authorized_keys
y estará remote:~/.ssh/authorized_keys
documentos de SSH-KEYGEN(1)
ssh-keygen -y [-f input_keyfile]
-y Esta opción leerá un archivo privado con formato OpenSSH e imprimirá una clave pública OpenSSH en la salida estándar.
Realmente no entiendo este:
de acuerdo con: http://www.madboa.com/geek/openssl/#key-rsa , puede generar una clave pública desde una clave privada.
openssl genrsa -out mykey.pem 1024
openssl rsa -in mykey.pem -pubout > mykey.pub
Mi pensamiento inicial fue que se generan en un par juntos. ¿La clave privada RSA contiene la suma? o la clave pública?
Aquí, en este código, primero estamos creando una clave RSA que es privada, pero también tiene un par de su clave pública, así que para obtener su clave pública real simplemente hacemos esto
openssl rsa -in mykey.pem -pubout > mykey.pub
Espero que lo consigas para más información, mira esto
En la mayoría de los programas que generan claves privadas RSA, incluidas las de openssl, la clave privada se representa como un objeto PKAP # 1 RSAPrivatekey o alguna variante del mismo:
A.1.2 Sintaxis de clave privada RSA
Una clave privada RSA debe representarse con el tipo ASN.1
RSAPrivateKey:
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 }
Como puede ver, este formato tiene varios campos que incluyen el módulo y el exponente público y, por lo tanto, es un superconjunto estricto de la información en una clave pública RSA .
En primer lugar un resumen rápido en la generación de claves RSA.
- Escoja aleatoriamente dos primos probables aleatorios del tamaño apropiado (p y q).
- Multiplica los dos primos juntos para producir el módulo (n).
- Elija un exponente público (e).
- Haga algunos cálculos con los números primos y el exponente público para producir el exponente privado (d).
La clave pública consiste en el módulo y el exponente público.
Una clave privada mínima consistiría en el módulo y el exponente privado. No hay una manera segura computacionalmente viable de pasar de un módulo conocido y exponente privado al exponente público correspondiente.
Sin embargo:
- Los formatos de clave privada prácticos casi siempre almacenan más de n y d.
- Normalmente, e no se escoge al azar, se usa uno de los pocos valores conocidos. Si e es uno de los valores conocidos y usted sabe d, entonces sería fácil descifrar e por prueba y error.
Por lo tanto, en la mayoría de las implementaciones prácticas de RSA, puede obtener la clave pública de la clave privada. Sería posible construir un sistema de cifrado basado en RSA donde esto no fuera posible, pero no es lo que se hizo.
La clave pública no se almacena en el archivo PEM como piensan algunas personas. La siguiente estructura DER está presente en el archivo de clave privada:
openssl rsa -text -in mykey.pem
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
}
Así que hay suficientes datos para calcular la clave pública (módulo y exponente público), que es lo que openssl rsa -in mykey.pem -pubout
hace
Mi respuesta a continuación es un poco larga, pero espero que proporcione 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 módulo y un par de exponentes (públicos) de cifrado (n, e). Esa es tu clave pública. Para descifrar algo utilizando el algoritmo RSA, necesita un módulo y un descifrado (privado) par exponente (n, d). Esa es tu clave privada.
Para cifrar algo utilizando la clave pública RSA, debe tratar su texto plano como un número y elevarlo a la potencia del módulo e n:
ciphertext = ( plaintext^e ) mod n
Para descifrar algo usando la clave privada RSA, trata el texto cifrado como un número y lo eleva a la potencia del módulo d:
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 RSA privada private.pem generada por el comando openssl anterior, ejecute lo siguiente (salida truncada a 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 constar de (n, d) solo par? ¿Por qué hay 6 componentes adicionales? Contiene e (exponente público) para que la clave RSA pública pueda generarse / extraerse / derivarse de la clave privada RSA private.pem. Los 5 componentes restantes están allí para acelerar el proceso de descifrado. Resulta que al pre-computar 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
Esta estructura de la clave privada RSA es recomendada por PKCS # 1 v1.5 como una representación alternativa ( segunda ). PKCS # 1 v2.0 estándar excluye los exponentes e y d de la representación alternativa por completo. PKCS # 1 v2.1 y v2.2 proponen cambios adicionales a la representación alternativa, incluyendo opcionalmente más componentes relacionados con CRT.
Para ver los contenidos de public.pem public RSA key, ejecute lo siguiente (salida truncada en las etiquetas aquí):
openssl rsa -in public.pem -text -pubin -noout
Modulus - n
Exponent (public) - e
No hay sorpresas aquí. Es sólo un par (n, e), como prometió.
Ahora, finalmente, responda a la pregunta inicial: como se mostró arriba, la clave RSA privada generada usando openssl contiene componentes de claves públicas y privadas y algunas más. Cuando genera / extrae / deriva una 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.
Use the following commands:
1. openssl req -x509 -nodes -days 365 -sha256 -newkey rsa:2048 -keyout mycert.pem -out mycert.pem
Loading ''screen'' into random state - done
Generating a 2048 bit RSA private key
.............+++
..................................................................................................................................................................+++
writing new private key to ''mycert.pem''
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ''.'', the field will be left blank.
2. If you check there will be a file created by the name : mycert.pem
3. openssl rsa -in mycert.pem -pubout > mykey.txt
writing RSA key
4. If you check the same file location a new public key : mykey.txt will be created.
openssl genrsa -out mykey.pem 1024
En realidad producirá un par de claves público - privadas. El par se almacena en el archivo mykey.pem
generado.
openssl rsa -in mykey.pem -pubout > mykey.pub
extraerá la clave pública y la imprimirá. Here hay un enlace a una página que describe esto mejor.
EDITAR: Consulte la sección de ejemplos here . Para dar salida a la parte pública de una clave privada:
openssl rsa -in key.pem -pubout -out pubkey.pem