Esquemas de Cifrado Híbrido en Criptografía

LinuxBeginner
Practicar Ahora

Introducción

En el mundo de la criptografía, a menudo nos enfrentamos a una compensación (trade-off) entre velocidad y seguridad. Los algoritmos de cifrado simétrico como AES son muy rápidos e ideales para cifrar grandes volúmenes de datos, pero requieren una clave secreta compartida que debe distribuirse de forma segura tanto al remitente como al receptor. Los algoritmos de cifrado asimétrico como RSA son excelentes para el intercambio seguro de claves mediante un par de claves pública/privada, pero son computacionalmente intensivos y demasiado lentos para cifrar datos masivos.

El cifrado híbrido resuelve este problema combinando las fortalezas de ambos métodos. Utiliza un enfoque de "lo mejor de ambos mundos":

  1. Se utiliza el cifrado asimétrico para cifrar y compartir de forma segura una clave simétrica temporal de un solo uso (a menudo denominada "clave de sesión").
  2. Luego, se utiliza el cifrado simétrico con esta clave de sesión para cifrar los datos del mensaje reales y más grandes de forma rápida y eficiente.

En este laboratorio, implementará un esquema de cifrado híbrido completo desde cero utilizando la herramienta de línea de comandos openssl. Generará un par de claves RSA, creará una clave de sesión AES aleatoria, utilizará RSA para cifrar la clave de sesión, utilizará AES para cifrar un mensaje y, finalmente, revertirá el proceso para descifrar el mensaje.

Este es un Guided Lab, que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y obtener experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 100%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Visión General del Cifrado Híbrido

En este paso, revisaremos brevemente los conceptos centrales que hacen del cifrado híbrido una técnica potente y ampliamente utilizada. No hay comandos que ejecutar en este paso; el objetivo es construir una base conceptual sólida antes de comenzar el trabajo práctico.

Cifrado Simétrico (p. ej., AES)

  • Funcionamiento: Utiliza una única clave secreta compartida tanto para el cifrado como para el descifrado.
  • Fortaleza: Muy rápido y eficiente, lo que lo hace perfecto para cifrar archivos grandes o flujos de datos.
  • Debilidad: Distribución de la clave. ¿Cómo se hace llegar la clave secreta compartida al destinatario de forma segura? Si un atacante intercepta la clave, puede descifrar toda la comunicación.

Cifrado Asimétrico (p. ej., RSA)

  • Funcionamiento: Utiliza un par de claves: una clave pública para el cifrado y una clave privada para el descifrado. La clave pública se puede compartir libremente, mientras que la clave privada debe ser mantenida en secreto por su propietario.
  • Fortaleza: Resuelve el problema de la distribución de claves. Cualquiera puede usar su clave pública para cifrarle un mensaje, pero solo usted puede descifrarlo con su clave privada.
  • Debilidad: Es matemáticamente complejo y, por lo tanto, mucho más lento que el cifrado simétrico. Es impráctico para cifrar grandes volúmenes de datos.

La Solución Híbrida

El cifrado híbrido combina estos dos métodos para obtener la seguridad del cifrado asimétrico y la velocidad del cifrado simétrico. Este es el flujo de trabajo típico:

  1. El remitente (Alice) desea enviar un mensaje seguro al receptor (Bob).
  2. Alice genera una nueva clave de sesión simétrica aleatoria.
  3. Alice cifra su mensaje real utilizando esta rápida clave de sesión simétrica.
  4. Alice obtiene la clave pública de Bob. La utiliza para cifrar únicamente la pequeña clave de sesión simétrica.
  5. Alice envía a Bob tanto el mensaje cifrado simétricamente como la clave de sesión cifrada asimétricamente.
  6. Bob recibe los dos elementos. Primero utiliza su clave privada para descifrar la clave de sesión cifrada.
  7. Ahora que Bob tiene la clave de sesión simétrica original, la utiliza para descifrar rápidamente el mensaje real.

Este proceso garantiza que los datos masivos se cifren de manera eficiente y que la clave utilizada para ese cifrado se intercambie con la máxima seguridad. En los siguientes pasos, implementaremos exactamente este flujo de trabajo.

Generar Claves RSA y AES

En este paso, generaremos los dos conjuntos de claves necesarios para nuestro esquema de cifrado híbrido: un par de claves RSA (pública y privada) para la parte asimétrica, y una clave de sesión aleatoria para la parte simétrica (AES). Todas las operaciones se realizarán en el directorio ~/project.

Primero, generaremos una clave privada RSA de 2048 bits. Esta clave debe ser mantenida en secreto por el destinatario.

openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048

Verá algo de salida mientras se genera la clave. A continuación, necesitamos extraer la clave pública correspondiente de la clave privada que acabamos de crear. Esta clave pública se puede compartir con cualquiera que desee enviarle un mensaje cifrado.

openssl rsa -pubout -in private_key.pem -out public_key.pem

El comando mostrará writing RSA key.

Ahora, crearemos una clave de sesión aleatoria de 256 bits (32 bytes). Esta clave se utilizará con el algoritmo AES para cifrar nuestros datos reales. Usamos openssl rand para generar datos aleatorios criptográficamente seguros y los codificamos en Base64 para facilitar su manejo.

openssl rand -base64 32 > session_key.key

Listemos los archivos en nuestro directorio para ver las claves que hemos creado.

ls -l

Debería ver los tres archivos de clave que acaba de generar, junto con el archivo message.txt creado durante la configuración.

-rw-rw-r-- 1 labex labex   57 Oct 20 15:12 message.txt
-rw------- 1 labex labex 1704 Oct 20 15:14 private_key.pem
-rw-rw-r-- 1 labex labex  451 Oct 20 15:14 public_key.pem
-rw-rw-r-- 1 labex labex   45 Oct 20 15:14 session_key.key

Cifrar Clave de Sesión con RSA

En este paso, realizaremos una parte crítica del proceso de cifrado híbrido: cifrar la clave de sesión simétrica. Para asegurar que solo el destinatario previsto pueda usar la clave de sesión, la cifraremos utilizando su clave pública RSA.

Usaremos el comando openssl pkeyutl, que es una utilidad para operaciones de clave pública. Lo emplearemos para cifrar el archivo session_key.key con la public_key.pem.

Ejecute el siguiente comando:

openssl pkeyutl -encrypt -pubin -inkey public_key.pem -in session_key.key -out encrypted_session_key.bin

Analicemos este comando:

  • pkeyutl: La herramienta de utilidad de clave pública (public key utility tool).
  • -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_key.pem: Especifica la clave pública a utilizar para el cifrado.
  • -in session_key.key: El archivo de entrada a cifrar (nuestra clave de sesión AES).
  • -out encrypted_session_key.bin: El archivo de salida donde se almacenará la clave cifrada.

Este comando crea un nuevo archivo, encrypted_session_key.bin, que contiene la clave de sesión en formato cifrado. Este archivo ahora puede transmitirse de forma segura, ya que solo el propietario de la clave privada correspondiente puede descifrarlo.

Verifiquemos el archivo recién creado:

ls -l encrypted_session_key.bin

Verá el archivo binario que contiene la clave cifrada.

-rw-rw-r-- 1 labex labex 256 Oct 20 15:14 encrypted_session_key.bin

Cifrar Datos con AES

Ahora que hemos asegurado nuestra clave de sesión, podemos usar la clave de sesión original sin cifrar para cifrar rápidamente nuestro archivo de datos principal, message.txt. Utilizaremos el cifrado simétrico AES-256-CBC para esta tarea.

El comando openssl enc requiere que la clave (key) y el Vector de Inicialización (IV) se proporcionen en formato hexadecimal. Nuestro session_key.key está en Base64, por lo que primero debemos decodificarlo y convertirlo a hexadecimal. También generaremos un IV aleatorio. Almacenaremos ambos en variables de entorno para mayor comodidad.

Primero, convierta la clave de sesión y almacénela en la variable AES_KEY:

export AES_KEY=$(cat session_key.key | base64 -d | xxd -p -c 32)

A continuación, genere un IV aleatorio de 128 bits (16 bytes) y almacénelo en la variable AES_IV. Un IV se utiliza para asegurar que cifrar el mismo texto plano varias veces resulte en textos cifrados diferentes.

export AES_IV=$(openssl rand -hex 16)

Con la clave y el IV listos, ahora podemos cifrar message.txt usando openssl enc:

openssl enc -aes-256-cbc -in message.txt -out encrypted_message.dat -K $AES_KEY -iv $AES_IV

Revisemos las opciones del comando:

  • -aes-256-cbc: Especifica el cifrado AES-256 en modo CBC.
  • -in message.txt: El archivo de datos de entrada.
  • -out encrypted_message.dat: El archivo de salida para los datos cifrados.
  • -K $AES_KEY: La clave de cifrado en formato hexadecimal (K mayúscula).
  • -iv $AES_IV: El vector de inicialización en formato hexadecimal.

En este punto, el remitente empaquetaría encrypted_message.dat, encrypted_session_key.bin y el IV ($AES_IV) para enviarlos al destinatario. Para este laboratorio, tenemos todos los archivos en nuestro directorio, listos para el paso de descifrado.

Verifiquemos que se ha creado el archivo de datos cifrado:

ls -l encrypted_message.dat
-rw-rw-r-- 1 labex labex 64 Oct 20 15:14 encrypted_message.dat

Descifrar Mensaje

En este paso final, simularemos las acciones del destinatario. El destinatario ha recibido los datos cifrados (encrypted_message.dat), la clave de sesión cifrada (encrypted_session_key.bin) y el IV. Utilizará su clave privada secreta para revertir el proceso y recuperar el mensaje original.

Primero, el destinatario debe descifrar la clave de sesión usando su private_key.pem.

openssl pkeyutl -decrypt -inkey private_key.pem -in encrypted_session_key.bin -out decrypted_session_key.key

Este comando utiliza pkeyutl con la bandera -decrypt y la clave privada para recuperar la clave de sesión AES original, guardándola en decrypted_session_key.key.

Podemos verificar rápidamente que la clave descifrada es idéntica a la original que creamos en el Paso 2. El comando diff no debería producir ninguna salida si los archivos son iguales.

diff session_key.key decrypted_session_key.key

Ahora que tenemos la clave de sesión, podemos descifrar el mensaje principal. Al igual que en el paso de cifrado, primero debemos convertir la clave a formato hexadecimal.

export DECRYPTED_AES_KEY=$(cat decrypted_session_key.key | base64 -d | xxd -p -c 32)

Finalmente, use openssl enc con la bandera -d (descifrar), proporcionando la misma clave e IV que se utilizaron para el cifrado. (La variable $AES_IV todavía está configurada en nuestro shell desde el paso anterior).

openssl enc -d -aes-256-cbc -in encrypted_message.dat -out decrypted_message.txt -K $DECRYPTED_AES_KEY -iv $AES_IV

¡El proceso está completo! El mensaje original ha sido recuperado y guardado en decrypted_message.txt. Veamos su contenido para confirmar nuestro éxito.

cat decrypted_message.txt

Debería ver el mensaje secreto original impreso en su terminal:

This is a secret message that needs to be sent securely.

Resumen

En este laboratorio, implementó con éxito un flujo de trabajo completo de cifrado y descifrado híbrido utilizando OpenSSL. Ha adquirido experiencia práctica con los conceptos fundamentales que aseguran gran parte de nuestra comunicación digital.

Aprendió a:

  • Generar un par de claves RSA para el cifrado asimétrico.
  • Crear una clave de sesión AES aleatoria para el cifrado simétrico.
  • Cifrar de forma segura la clave de sesión utilizando la clave pública RSA.
  • Cifrar eficientemente grandes volúmenes de datos utilizando la clave de sesión AES.
  • Revertir el proceso descifrando la clave de sesión con la clave privada RSA y luego descifrando los datos.

Este enfoque de "lo mejor de ambos mundos", que combina la seguridad de la criptografía asimétrica para el intercambio de claves con la velocidad de la criptografía simétrica para el cifrado de datos, es una piedra angular de los protocolos de seguridad modernos como TLS/SSL que protegen sus datos en Internet todos los días.