Intercambio Básico de Claves con Diffie-Hellman en Criptografía

LinuxBeginner
Practicar Ahora

Introducción

En este laboratorio, explorará los fundamentos del intercambio de claves Diffie-Hellman (DH), una piedra angular de la criptografía moderna. El protocolo DH permite que dos partes, que no tienen conocimiento previo entre sí, establezcan conjuntamente una clave secreta compartida a través de un canal de comunicación inseguro. Esta clave secreta compartida puede utilizarse posteriormente para cifrar las comunicaciones subsiguientes mediante un cifrado de clave simétrica.

Utilizará la potente herramienta de línea de comandos openssl para simular todo el proceso DH. Esto incluye la generación de los parámetros públicos, la creación de claves privadas y públicas para dos partes separadas, y finalmente, la derivación y verificación de la clave secreta compartida. Al finalizar este laboratorio, tendrá una comprensión práctica de cómo funciona este apretón de manos criptográfico esencial.

Principio del Intercambio de Claves Diffie-Hellman

En este paso, cubriremos el principio teórico del intercambio de claves Diffie-Hellman. No hay comandos que ejecutar en este paso; el objetivo es comprender el concepto antes de implementarlo.

El proceso funciona de la siguiente manera:

  1. Acuerdo sobre Parámetros Públicos: Dos partes, llamémoslas Alicia y Bob, acuerdan primero dos números públicos: un número primo grande p (el módulo) y una base g (el generador). Estos números no son secretos y pueden transmitirse a través de un canal inseguro.

  2. Generación de Clave Privada:

    • Alicia elige un entero privado secreto a. Ella mantiene este número para sí misma.
    • Bob elige un entero privado secreto b. Él mantiene este número para sí mismo.
  3. Cálculo de Clave Pública:

    • Alicia calcula su clave pública A usando la fórmula: A = g^a \mod p. Ella envía esta clave pública A a Bob.
    • Bob calcula su clave pública B usando la fórmula: B = g^b \mod p. Él envía esta clave pública B a Alicia.
  4. Derivación del Secreto Compartido:

    • Alicia recibe la clave pública B de Bob y calcula el secreto compartido S usando su propia clave privada a: S = B^a \mod p.
    • Bob recibe la clave pública A de Alicia y calcula el secreto compartido S usando su propia clave privada b: S = A^b \mod p.

Debido a las propiedades de la aritmética modular, tanto Alicia como Bob llegarán exactamente al mismo valor para S.

  • Cálculo de Alicia: S = (g^b \mod p)^a \mod p = g^{ba} \mod p
  • Cálculo de Bob: S = (g^a \mod p)^b \mod p = g^{ab} \mod p

Un espía en el canal puede ver p, g, A y B, pero no puede calcular fácilmente las claves privadas a o b. Esta dificultad se conoce como el problema del logaritmo discreto, que constituye la base de la seguridad del intercambio Diffie-Hellman.

En los siguientes pasos, utilizará openssl para realizar estas acciones.

Generar Parámetros Diffie-Hellman

En este paso, generará los parámetros DH públicos (p y g) que ambas partes utilizarán. La herramienta openssl puede manejar la compleja matemática de encontrar un primo y un generador adecuados por usted. Todas las operaciones en este laboratorio se realizarán en el directorio predeterminado ~/project.

Utilice el comando openssl dhparam para generar los parámetros. Especificaremos una longitud de clave de 2048 bits, que es una longitud común y segura para este propósito.

Ejecute el siguiente comando en su terminal:

openssl dhparam -out dhparam.pem 2048

Analicemos este comando:

  • openssl dhparam: Invoca la herramienta de gestión de parámetros DH en OpenSSL.
  • -out dhparam.pem: Esta bandera especifica que la salida debe guardarse en un archivo llamado dhparam.pem.
  • 2048: Esta es la longitud en bits deseada para el módulo primo p.

Este comando puede tardar un minuto en completarse, ya que busca un número primo fuerte. Verá una salida similar a la siguiente mientras está trabajando:

Generating DH parameters, 2048 bit long safe prime

Una vez finalizado, se creará un archivo llamado dhparam.pem en su directorio actual. Este archivo contiene los parámetros públicos que ambas partes utilizarán para el intercambio de claves.

Generar Claves de la Parte A

En este paso, simulará las acciones de la primera parte, la "Parte A". La Parte A utilizará los parámetros DH compartidos del paso anterior para generar su propia clave privada y luego derivar una clave pública correspondiente.

Primero, genere la clave privada de la Parte A. Esta clave es el número secreto a de nuestro ejemplo teórico. Utilizaremos el comando openssl genpkey, que es una utilidad de propósito general para la generación de claves.

Ejecute el siguiente comando para generar la clave privada de la Parte A:

openssl genpkey -paramfile dhparam.pem -out a_private_key.pem
  • genpkey: El comando para generar una clave privada.
  • -paramfile dhparam.pem: Esto le indica a genpkey que use los parámetros de nuestro archivo dhparam.pem para crear una clave DH.
  • -out a_private_key.pem: Esto guarda la clave privada generada en el archivo a_private_key.pem.

A continuación, la Parte A necesita derivar su clave pública a partir de la clave privada. La clave pública es lo que se compartirá con la Parte B.

Ejecute este comando para extraer la clave pública:

openssl pkey -in a_private_key.pem -pubout -out a_public_key.pem
  • pkey: Un comando para gestionar claves públicas y privadas.
  • -in a_private_key.pem: Especifica la clave privada de entrada.
  • -pubout: Esta bandera instruye al comando a generar la parte pública de la clave como salida.
  • -out a_public_key.pem: Guarda la clave pública resultante en a_public_key.pem.

Ahora tiene dos archivos nuevos: a_private_key.pem, que la Parte A debe mantener en secreto, y a_public_key.pem, que la Parte A enviaría a la Parte B a través del canal inseguro.

Generar Claves de la Parte B

En este paso, realizará las mismas acciones para la segunda parte, la "Parte B". La Parte B opera independientemente de la Parte A, pero utiliza los mismos parámetros DH públicos de dhparam.pem.

Primero, genere la clave privada de la Parte B. Esto corresponde al número secreto b en nuestro ejemplo teórico.

Ejecute el siguiente comando:

openssl genpkey -paramfile dhparam.pem -out b_private_key.pem

Este comando es idéntico en estructura al de la Parte A, pero estamos guardando la salida en b_private_key.pem para distinguirla.

A continuación, al igual que la Parte A, la Parte B debe derivar su clave pública a partir de su nueva clave privada.

Ejecute este comando para extraer la clave pública de la Parte B:

openssl pkey -in b_private_key.pem -pubout -out b_public_key.pem

En este punto de un intercambio en el mundo real, la Parte A tendría la clave pública de la Parte B (b_public_key.pem), y la Parte B tendría la clave pública de la Parte A (a_public_key.pem). Ambas partes han mantenido sus respectivas claves privadas en secreto. Ahora ha simulado con éxito la porción de generación e intercambio de claves del protocolo.

Calcular Secreto Compartido

Este es el paso final y más importante. Aquí, ambas partes utilizarán su propia clave privada y la clave pública de la otra parte para calcular de forma independiente el secreto compartido. Si el protocolo es exitoso, ambas llegarán exactamente al mismo valor secreto.

Primero, calculemos el secreto compartido desde la perspectiva de la Parte A. La Parte A utiliza su clave privada (a_private_key.pem) y la clave pública de la Parte B (b_public_key.pem).

Ejecute el siguiente comando:

openssl pkeyutl -derive -inkey a_private_key.pem -peerkey b_public_key.pem -out a_shared_secret.bin
  • pkeyutl: Una utilidad para realizar operaciones de clave pública.
  • -derive: Esta acción le indica a la utilidad que derive un secreto compartido.
  • -inkey a_private_key.pem: Especifica la clave privada propia de la Parte A.
  • -peerkey b_public_key.pem: Especifica la clave pública de la otra parte (el "par" o "peer").
  • -out a_shared_secret.bin: Guarda el secreto binario resultante en un archivo.

A continuación, calcule el secreto compartido desde la perspectiva de la Parte B. La Parte B utiliza su clave privada (b_private_key.pem) y la clave pública de la Parte A (a_public_key.pem).

Ejecute el siguiente comando:

openssl pkeyutl -derive -inkey b_private_key.pem -peerkey a_public_key.pem -out b_shared_secret.bin

Ahora, tiene dos archivos, a_shared_secret.bin y b_shared_secret.bin. Para verificar el éxito del intercambio de claves, estos dos archivos deben ser idénticos. Puede usar el comando cmp (comparar) para verificar esto.

cmp a_shared_secret.bin b_shared_secret.bin

Si los archivos son idénticos, este comando no producirá ninguna salida y terminará silenciosamente. ¡Este silencio significa éxito!

Para una confirmación más visual, también puede calcular el hash criptográfico de ambos archivos. Los hashes deben coincidir.

sha256sum *.bin

Debería ver una salida donde ambos archivos tienen el mismo hash SHA256 exacto. Los valores de hash reales variarán entre ejecuciones, pero deben ser idénticos para ambos archivos:

e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  a_shared_secret.bin
e3705a4ab5ae5d86f59dfe968f0177b49d5144e2d731dbd8d41b2eda318412ec  b_shared_secret.bin

(Nota: Sus valores hash serán diferentes a los de este ejemplo, pero lo importante es que los hashes para a_shared_secret.bin y b_shared_secret.bin deben ser idénticos, probando que ambas partes derivaron el mismo secreto compartido).

¡Felicidades, ha realizado con éxito un intercambio de claves Diffie-Hellman!

Resumen

En este laboratorio, ha simulado con éxito un intercambio de claves Diffie-Hellman completo utilizando la herramienta de línea de comandos openssl. Ha adquirido experiencia práctica con los pasos fundamentales de este protocolo criptográfico crítico.

Usted aprendió a:

  • Generar parámetros DH públicos compartidos (openssl dhparam).
  • Crear pares de claves privada y pública para dos partes separadas basándose en esos parámetros (openssl genpkey y openssl pkey).
  • Derivar un secreto compartido a partir de la clave privada propia y la clave pública de un par (openssl pkeyutl -derive).
  • Verificar que ambas partes calcularon de forma independiente el mismo secreto exacto, probando el éxito del intercambio.

Este proceso es un bloque de construcción fundamental para sistemas de comunicación seguros como TLS/SSL, que protegen los datos a través de Internet. Ahora tiene una comprensión práctica de cómo dos partes pueden establecer un canal seguro para la comunicación, incluso comenzando en una red insegura.