Cifrado Asimétrico con RSA en Criptografía

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará los principios del cifrado asimétrico, una piedra angular de la criptografía moderna. A diferencia del cifrado simétrico que utiliza una única clave tanto para el cifrado como para el descifrado, el cifrado asimétrico utiliza un par de claves: una clave pública y una clave privada.

La clave pública se utiliza para el cifrado y puede compartirse con cualquiera. La clave privada se mantiene en secreto y se utiliza para el descifrado. Este mecanismo permite una comunicación segura sin necesidad de compartir una clave secreta de antemano.

Utilizaremos el algoritmo RSA, ampliamente adoptado, y la potente herramienta de línea de comandos openssl para demostrar este proceso. Aprenderá a generar un par de claves, cifrar un mensaje con la clave pública y descifrarlo con la clave privada. Todas las operaciones se realizarán en la terminal dentro de su directorio ~/project.

Fundamentos del Cifrado Asimétrico

En este paso, aprenderá los conceptos centrales del cifrado asimétrico, también conocido como criptografía de clave pública. Este es un paso conceptual sin comandos para ejecutar, pero comprender estos principios es crucial para las tareas prácticas que siguen.

El cifrado asimétrico se basa en dos claves distintas pero matemáticamente vinculadas:

  • Clave Pública (Public Key): Esta clave se pone a disposición de todos. Su función principal es cifrar datos. Cualquiera que posea la clave pública puede cifrar un mensaje, pero no puede usarla para descifrar ese mismo mensaje. Piense en ella como la ranura de un buzón abierto: cualquiera puede depositar una carta.

  • Clave Privada (Private Key): Esta clave debe mantenerse secreta y segura por su propietario. Su función es descifrar los datos que han sido cifrados con su clave pública correspondiente. Solo la persona que posee la clave privada puede descifrar el mensaje. En nuestra analogía del buzón, la clave privada es la llave única que puede abrir el buzón y recuperar las cartas.

Esta relación unidireccional es la base de la comunicación segura a través de redes inseguras. En los siguientes pasos, generará su propio par de claves pública/privada y las utilizará para cifrar y descifrar un mensaje.

Generar Par de Claves RSA

En este paso, generará un par de claves RSA utilizando la herramienta de línea de comandos openssl. Este comando creará un único archivo que contendrá tanto el componente de clave privada como el de clave pública.

Ejecute el siguiente comando en su terminal. Todos los comandos en este laboratorio deben ejecutarse desde el directorio predeterminado ~/project.

openssl genrsa -out private.pem 2048

Analicemos este comando:

  • openssl: El comando para invocar el conjunto de herramientas OpenSSL.
  • genrsa: El comando específico para generar una clave privada RSA.
  • -out private.pem: Esta bandera especifica el nombre del archivo de salida para la clave. Lo estamos nombrando private.pem.
  • 2048: Esta es la longitud de la clave en bits. 2048 bits es una longitud estándar y segura para las claves RSA.

Ahora, verifique que el archivo private.pem se haya creado en su directorio actual usando el comando ls.

ls

Debería ver private.pem listado en la salida.

private.pem

Extraer Clave Pública

En este paso, extraerá la clave pública del archivo private.pem que creó. Aunque el archivo de clave privada contiene todos los componentes necesarios, necesita un archivo de clave pública separado que pueda compartir de forma segura con otros para cifrar mensajes.

Utilice el siguiente comando para extraer la clave pública:

openssl rsa -in private.pem -pubout -out public.pem

A continuación, se presenta un desglose del comando:

  • openssl rsa: Este comando se utiliza para procesar claves RSA.
  • -in private.pem: Especifica el archivo de entrada, que es nuestra clave privada.
  • -pubout: Esta bandera indica a openssl que extraiga y muestre la parte pública de la clave.
  • -out public.pem: Especifica el nombre del archivo de salida para la clave pública.

El comando producirá una breve salida confirmando la operación.

writing RSA key

Ahora, liste los archivos en su directorio nuevamente para ver tanto la clave privada como la pública.

ls

Ahora debería ver tanto private.pem como public.pem.

private.pem  public.pem

Puede ver el contenido del archivo de clave pública. Es un archivo de texto en formato PEM.

cat public.pem
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
...
-----END PUBLIC KEY-----

Cifrar Mensaje con Clave Pública

En este paso, creará un mensaje secreto y luego lo cifrará utilizando la clave pública que acaba de extraer. Solo alguien con la clave privada correspondiente podrá descifrarlo.

Primero, creemos un archivo de texto simple que contenga nuestro mensaje secreto.

echo "This is a secret message." > message.txt

Este comando crea un archivo llamado message.txt con el contenido especificado. Ahora, cifremos este archivo usando la clave pública.

openssl pkeyutl -encrypt -pubin -inkey public.pem -in message.txt -out encrypted.bin

Examinemos este comando:

  • openssl pkeyutl: Una utilidad para realizar operaciones de clave pública como cifrado y descifrado.
  • -encrypt: Especifica que queremos realizar una operación de cifrado.
  • -pubin: Indica que la clave de entrada (-inkey) es una clave pública.
  • -inkey public.pem: Especifica la clave pública a utilizar para el cifrado.
  • -in message.txt: El archivo de entrada que contiene el mensaje en texto plano (plaintext).
  • -out encrypted.bin: El archivo de salida donde se almacenarán los datos cifrados (ciphertext).

Después de ejecutar el comando, se creará un nuevo archivo encrypted.bin. Si intenta ver su contenido, verá datos binarios ilegibles, que es la forma cifrada de su mensaje.

cat encrypted.bin

La salida será una cadena de caracteres ilegibles, lo que confirma que el mensaje está cifrado.

Descifrar Mensaje con Clave Privada

En este paso final, descifrará el mensaje cifrado utilizando su clave privada para recuperar el texto plano (plaintext) original. Esto demuestra que solo el poseedor de la clave privada puede acceder a la información secreta.

Utilice el siguiente comando para descifrar encrypted.bin:

openssl pkeyutl -decrypt -inkey private.pem -in encrypted.bin -out decrypted.txt

Revisemos las opciones del comando:

  • openssl pkeyutl: La misma utilidad que antes.
  • -decrypt: Esta vez, especificamos la operación de descifrado.
  • -inkey private.pem: Especifica la clave privada a utilizar para el descifrado.
  • -in encrypted.bin: El archivo de entrada que contiene el texto cifrado (ciphertext).
  • -out decrypted.txt: El archivo de salida donde se guardará el texto plano recuperado.

Este comando creará un nuevo archivo llamado decrypted.txt. Para verificar que el descifrado fue exitoso, muestre el contenido de este nuevo archivo.

cat decrypted.txt

Debería ver su mensaje original restaurado perfectamente.

This is a secret message.

¡Felicidades! Ha realizado con éxito un ciclo completo de cifrado y descifrado asimétrico utilizando RSA y OpenSSL.

Resumen

En este laboratorio, ha adquirido experiencia práctica con el cifrado asimétrico utilizando el algoritmo RSA y el conjunto de herramientas OpenSSL.

Ha aprendido la diferencia fundamental entre las claves pública y privada y sus respectivos roles en la protección de las comunicaciones.

Específicamente, ha practicado las siguientes habilidades clave:

  • Generar un par de claves RSA de 2048 bits usando openssl genrsa.
  • Extraer una clave pública de un archivo de clave privada usando openssl rsa.
  • Cifrar un mensaje en texto plano con una clave pública usando openssl pkeyutl.
  • Descifrar el texto cifrado resultante con la clave privada correspondiente usando openssl pkeyutl.

Estas habilidades son fundamentales para comprender e implementar sistemas seguros en diversas aplicaciones, desde la navegación web segura (HTTPS) hasta el correo electrónico cifrado y las firmas digitales.