Fundamentos del Cifrado Simétrico en Criptografía

LinuxBeginner
Practicar Ahora

Introducción

El cifrado simétrico es un concepto fundamental en criptografía donde se utiliza una única clave tanto para cifrar como para descifrar información. Este método es rápido y eficiente, lo que lo hace ideal para cifrar grandes volúmenes de datos.

En este laboratorio (lab), obtendrá experiencia práctica con el cifrado simétrico utilizando la potente herramienta de línea de comandos openssl en un entorno Linux. Recorrerá el proceso completo: generar una clave secreta, cifrar un archivo de texto, descifrarlo y, finalmente, verificar que el archivo descifrado es idéntico al original.

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 90%. Ha recibido una tasa de reseñas positivas del 100% por parte de los estudiantes.

Concepto de Cifrado Simétrico

En este paso, revisaremos brevemente el concepto central del cifrado simétrico. La parte "simétrica" significa que la misma clave que bloquea (cifra) los datos es la que se utiliza también para desbloquearlos (descifrarlos).

Imagine que tiene una caja fuerte física. Utiliza una llave para cerrarla. Para volver a abrirla, debe usar exactamente la misma llave. En el cifrado simétrico, esta clave es un fragmento de información digital y debe compartirse de forma segura entre las partes que necesitan cifrar y descifrar los datos. Si esta clave única se ve comprometida, se pierde la seguridad de los datos cifrados.

Para este laboratorio, trabajaremos con un archivo de texto simple. Se ha precreado un archivo llamado original.txt para usted en el directorio ~/project. Puede ver su contenido y confirmar que es un archivo de texto plano y legible.

Listemos los archivos en el directorio actual para verlo:

ls -l

Debería ver el archivo original.txt en la salida:

-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

Ahora, veamos su contenido:

cat original.txt

La salida será el mensaje de texto simple dentro del archivo:

This is a secret message.

En los siguientes pasos, cifraremos este archivo para hacerlo ilegible y luego lo descifraremos a su forma original.

Generar Clave AES

En este paso, generará una clave aleatoria y segura para nuestro proceso de cifrado. La solidez del cifrado simétrico depende en gran medida del secreto y la aleatoriedad de la clave. Una clave predecible es fácil de adivinar, lo que inutiliza el cifrado.

Utilizaremos el comando openssl rand para generar una clave aleatoria criptográficamente fuerte. Generaremos una clave de 256 bits, que es una longitud estándar para el algoritmo AES (Advanced Encryption Standard).

Ejecute el siguiente comando para generar una clave de 32 bytes (256 bits) en formato hexadecimal y guardarla en un archivo llamado aes.key:

openssl rand -hex 32 > aes.key

Analicemos este comando:

  • openssl rand: El comando para generar datos aleatorios.
  • -hex: Formatea la salida como una cadena hexadecimal.
  • 32: Especifica el número de bytes de datos aleatorios a generar. Dado que cada carácter hexadecimal representa 4 bits (o medio byte), 32 bytes de datos resultarán en una cadena hexadecimal de 64 caracteres.
  • > aes.key: Redirige la salida del comando y la guarda en el archivo aes.key.

Ahora, veamos la clave generada. Recuerde que su clave será diferente de la del ejemplo a continuación, ya que se genera aleatoriamente.

cat aes.key

Verá una larga cadena de caracteres hexadecimales, que es su clave secreta de 256 bits:

2da75d4f284618ed6933d0e743757ed014ba39a1a8aa1879ebbbfe53b92d519a

Este archivo, aes.key, ahora contiene el secreto que utilizaremos tanto para cifrar como para descifrar nuestros datos.

Cifrar Archivo con AES

En este paso, utilizará la clave que generó para cifrar el archivo original.txt. Usaremos el comando openssl enc, que es una herramienta versátil para el cifrado y descifrado.

Utilizaremos el cifrado AES-256-CBC.

  • AES-256: Se refiere al Estándar de Cifrado Avanzado con una clave de 256 bits.
  • CBC: Significa Cipher Block Chaining (Encadenamiento de Bloques de Cifrado), un modo de operación que añade aleatoriedad y asegura que bloques idénticos de texto plano no resulten en bloques idénticos de texto cifrado.

Ejecute el siguiente comando para cifrar el archivo:

openssl enc -aes-256-cbc -pbkdf2 -salt -in original.txt -out encrypted.dat -pass file:./aes.key

Examinemos las opciones del comando:

  • openssl enc: El comando para los cifrados de encriptación.
  • -aes-256-cbc: Especifica el algoritmo de cifrado a utilizar.
  • -pbkdf2: Utiliza una función de derivación de clave basada en estándares moderna (PBKDF2) para evitar advertencias de obsolescencia.
  • -salt: Añade una "sal" (salt) aleatoria a la clave antes del cifrado. Esta es una práctica de seguridad crucial que protege contra ciertos tipos de ataques.
  • -in original.txt: Especifica el archivo de entrada a cifrar.
  • -out encrypted.dat: Especifica el nombre del archivo de salida que almacenará los datos cifrados.
  • -pass file:./aes.key: Indica a OpenSSL que lea la contraseña (en nuestro caso, la clave simétrica) del archivo aes.key.

Después de ejecutar el comando, se creará un nuevo archivo llamado encrypted.dat. Intentemos ver su contenido:

cat encrypted.dat

La salida será un revoltijo de caracteres ininteligibles, lo que confirma que el archivo está cifrado.

Salted___Mi72j)NU_nJ_h9s(0]%

Ahora ha cifrado exitosamente su mensaje secreto. Cualquiera que obtenga este archivo sin el aes.key no podrá leer su contenido.

Descifrar Archivo con AES

En este paso, descifrará el archivo encrypted.dat para recuperar el mensaje original. Dado que este es un cifrado simétrico, utilizaremos la misma clave (aes.key) y el mismo comando base (openssl enc) que usamos para el cifrado.

La diferencia clave es la adición del indicador -d, que le indica a OpenSSL que realice el descifrado en lugar del cifrado.

Ejecute el siguiente comando para descifrar el archivo:

openssl enc -d -aes-256-cbc -pbkdf2 -in encrypted.dat -out decrypted.txt -pass file:./aes.key

Este comando es muy similar al comando de cifrado:

  • -d: Este indicador especifica que queremos descifrar el archivo de entrada.
  • -aes-256-cbc: Debemos especificar el mismo cifrado que se utilizó para el cifrado.
  • -pbkdf2: Debe usar la misma función de derivación de clave que se utilizó para el cifrado.
  • -in encrypted.dat: El archivo de entrada es ahora nuestro dato cifrado.
  • -out decrypted.txt: El archivo de salida donde se guardará el texto descifrado y legible.
  • -pass file:./aes.key: Proporcionamos la misma clave que se utilizó para cifrar el archivo.

Una vez que el comando se complete, se creará un nuevo archivo llamado decrypted.txt. Veamos su contenido para verificar si el descifrado fue exitoso.

cat decrypted.txt

La salida debe ser el mensaje original, exactamente como estaba en original.txt:

This is a secret message.

¡Felicidades! Ha completado con éxito un ciclo completo de cifrado y descifrado.

Verificar Integridad del Archivo

En este paso final, verificaremos que el proceso de descifrado fue perfecto y que el archivo decrypted.txt es una copia exacta del archivo original.txt. Si bien podemos confirmar esto visualmente para un mensaje corto, es necesaria una verificación programática para archivos más grandes o scripts automatizados.

El comando diff en Linux es la herramienta perfecta para este trabajo. Compara dos archivos línea por línea e informa cualquier diferencia. Si los archivos son idénticos, diff no producirá ninguna salida.

Ejecute el comando diff para comparar los archivos original y descifrado:

diff original.txt decrypted.txt

Si el comando se ejecuta y se le devuelve al prompt de comandos sin ningún mensaje, significa que los archivos son idénticos. Este silencio es la confirmación del éxito. Demuestra que sus datos han mantenido su integridad durante todo el ciclo de cifrado y descifrado.

Para ver todos los archivos con los que ha trabajado en este laboratorio, puede ejecutar ls -l una vez más:

ls -l

Verá el archivo original, la clave, los datos cifrados y el archivo final descifrado:

-rw-rw-r-- 1 labex labex 65 Oct 20 08:57 aes.key
-rw-rw-r-- 1 labex labex 26 Oct 20 08:57 decrypted.txt
-rw-rw-r-- 1 labex labex 48 Oct 20 08:57 encrypted.dat
-rw-rw-r-- 1 labex labex 26 Oct 20 08:56 original.txt

Esto confirma que ha gestionado con éxito todo el ciclo de vida del cifrado simétrico.

Resumen

En este laboratorio, adquirió experiencia práctica con los fundamentos del cifrado simétrico utilizando openssl en un entorno Linux.

Ha completado con éxito un flujo de trabajo completo de cifrado y descifrado:

  • Aprendió el concepto central de una única clave compartida tanto para el cifrado como para el descifrado.
  • Utilizó openssl rand para generar una clave AES fuerte de 256 bits.
  • Utilizó openssl enc para cifrar un archivo de texto, haciéndolo ilegible.
  • Utilizó el mismo comando con el indicador -d para descifrar el archivo a su estado original.
  • Finalmente, utilizó el comando diff para verificar programáticamente que los datos descifrados eran idénticos a los originales, confirmando la integridad de los datos.

Este ejercicio práctico proporciona una base sólida para comprender cómo funcionan los cifrados simétricos y cómo se aplican en la práctica para proteger los datos.