Criptografía asimétrica en OpenSSL - Llave privada

Author
By Darío Rivera
Posted on 2019-08-15 in OpenSSL
Tags   OpenSSL 1.1

En nuestro post anterior hemos visto cómo encriptar mensajes con llave pública en criptografía de dos llaves. El día de hoy veremos que este proceso también es inverso, y se puede encriptar mensajes con la llave privada y desencriptarlos con la llave pública.

Definición

La criptografía asimétrica o de dos llaves, como su nombre lo indica, es un sistema criptográfico que utiliza dos llaves para el envío y recepción de mensajes. Estas dos llaves pertenecen a una misma persona y una de ellas es pública y la otra privada. Esta persona debe asegurar que su llave privada jamás llegue a manos de otra persona. Por el contrario su llave pública debe ser compartida con otros usuarios para permitir el envío o recepción de mensajes. La criptografía asimétrica asegura dos atributos de la información, la confidencialidad (cifrado con llave pública) y la autenticidad (cifrado con llave privada)

En este post nos centraremos en tratar la autenticidad. Es decir, que un mensaje haya sido enviado por quien dice ser. Veamos el siguiente ejemplo.

18_1

Supongamos que Emily desea enviarle un mensaje de manera auténtica a Steave. Porsupuesto ambos eligieron la criptografía asimétrica para tal fin. Para que este esenario sea posible únicamente se necesitan las dos llaves (pública y privada) de Emily. A continuación se enumera la serie de pasos para el envío y recepción del mensaje en mención.

  1. Emily escribe el mensaje que le enviará a Steave.
  2. Emily encripta con la llave privada de ella el mensaje que le enviará.
  3. Emily envía el mensaje a través de internet.
  4. Steave recibe el mensaje encriptado de Emily.
  5. Steave utiliza la llave pública de Emily para descifrar el mensaje y poder leerlo.

Como puedes ver este esquema de envío de información implica que los mensajes sean encriptados y enviados por un canal inseguro como internet. En segundo lugar, la persona receptora del mensaje debe tener la llave pública del emisor para desencriptar el mensaje, puesto que en esencia la llave pública la puede conseguir cualquier persona una vez compartida, puedes notar que cualquier persona podría desencriptar el mensaje. Sin embargo, el objetivo de la cifrado por este método no es la confidencialidad sino la autenticidad, puesto que un mensaje encriptado con llave privada solo puede ser desencriptado con la llave pública que está ligada a la llave privada. Con esto, se asegura que el emisor en realidad posee su llave privada, y por lo tanto confirma su autenticidad.

Generación de las llaves

Para generar una llave privada basta ejecutar el siguiente comando:

openssl genrsa -out key.pem 1024

El producto de la ejecución de este comando es el archivo key.pem y su contenido será similar al que se muestra a continuación

-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQC/p+SkOM3pAPvauL+HvOj9R7ME4Mauy5Vr661fQg2nmMqsyPKM
cRJzod+qEJPiGrNPpPxZUq0OOaW1oLJF+s5hbh46peQb86Yh4TDZZsy0gpFov6KA
LrsHseTnZH+dayLkgMEof6ddVWjWS+p1J9hx8D1Efm55pZyIVWHz1UGr/wIDAQAB
AoGAffQawQpL2Hs7CU0tIkm2XO4H6obGTA2jT199ewLv8lrpp5AQRtfwpmmVkjB+
37NocEkfRpyc+qJMEwde4bqoch4H71Q/gzRC9Kkph8814A+XjnD3lwrL0sSYdi4k
UGz1nPKudT5ls3CkJFs+rx0/CThAB6E3+qezLt8+1TWmSXECQQD6wCEUsIU8NaVf
HDOO76H/C6jdc3+eQSVR40kyYMOscWe0NzzB3KQnnpJIYLZvkHRUytSdBgNz8dNo
mcp0LUNFAkEAw6sNYZxAKgLposU+nlplX6jmq3PqKnCB7aDP+kHzi5ypMo/XYno4
qOORiWL0G4q/sFaJmQ/yeyUrbhvuV6fkcwJBAPARbFqbmiQIFHkXzgEGSmmdpyHG
B6PjKTDaU2UJIa4CsU/oJqJQdVV9Sv5Cocf0XHwl6SMg88NY/pfBzgQmpaUCQA4z
20vLgKjL/1NuR8ZMv3D7HIszZbrg4b1y38XFhb0LiQh/gl3Gi1hO9GBpi1h4cMOG
9IPksXAY2Zcrddhs+lsCQAHvd+q17h9ofpwsvx6RrEIzCJD9tbwPdKWdqkJOSJgc
jPzZIDA4bpPNCFZzZq3IYR2rEK800lxrVgNKtKWRkVQ=
-----END RSA PRIVATE KEY-----

Es importante que te vayas familiarizando con cada uno de los resultados que puede arrojar un comando en openssl para reconocer las llaves privadas, públicas, certificados, entre otros.

Por defecto la llave es creada en formato PEM. Para elegir entre cualquiera de los formatos DER o NET debes utilizar la opción -outform para convertir el PEM al formato elegido.

openssl genrsa -in key.pem -outform DER -out key.der 1024

De la llave privada se extrae la parte que será la llave pública. Para hacer esto ejecutamos el siguiente comando:

openssl rsa -in key.pem -pubout -out pub-key.pem

El producto de la ejecución de este comando es el archivo pub-key.pem y su contenido será similar al que se muestra a continuación

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/p+SkOM3pAPvauL+HvOj9R7ME
4Mauy5Vr661fQg2nmMqsyPKMcRJzod+qEJPiGrNPpPxZUq0OOaW1oLJF+s5hbh46
peQb86Yh4TDZZsy0gpFov6KALrsHseTnZH+dayLkgMEof6ddVWjWS+p1J9hx8D1E
fm55pZyIVWHz1UGr/wIDAQAB
-----END PUBLIC KEY-----

Ya tenemos nuestra llave pública (pub-key.pem) y privada (key.pem). Vamos a ver ahora cómo enviar un mensaje encriptado siguiendo el esquema planteado anteriormente.

Cifrado

Supongamos que queremos enviar un mensaje con nuestra llave privada key.pem. Para encriptar un mensaje con esta llave debemos utilizar el comando openssl rsautl con la opción -encrypt.

echo "Hola mundo" > message.txt
openssl rsautl -inkey key.pem -in message.txt -sign > message.enc

El producto de esta ejecución es el archivo message.enc el cuál podemos enviar al destinatario. Por consiguiente, dicho destinatario podrá desencriptar el mensaje básicamente con el mismo comando de la siguiente manera utilizando nuestra llave pública.

openssl rsautl -inkey pub-key.pem -pubin -in message.enc -out message.dec

El contenido del archivo message.dec contendrá el mensaje original. 


Si te ha gustado este artículo puedes invitarme a tomar una taza de café

Acerca de Darío Rivera

Author

Ingeniero de desarrollo en PlacetoPay , Medellín. Darío ha trabajado por más de 6 años en lenguajes de programación web especialmente en PHP. Creador del microframework DronePHP basado en Zend y Laravel.

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.