Sobes.tech
Senior

¿Cómo se realiza el cifrado de la información en el algoritmo Diffie-Hellman?

sobes.tech AI

Respuesta de la IA

El cifrado en sí mismo no es una función directa del algoritmo Diffie-Hellman. Su objetivo principal es el intercambio seguro de claves criptográficas a través de un canal abierto. Luego, esta clave secreta común puede ser utilizada para cifrado simétrico de datos.

El proceso de intercambio de claves es el siguiente:

  1. Selección de parámetros públicos: Dos partes (Alicia y Bob) acuerdan un gran número primo p y un número base g (generador del grupo cíclico Zₚ*). g debe ser un raíz primitiva módulo p.
  2. Generación de números secretos: Cada parte genera su propio número secreto aleatorio. Alicia elige a, Bob elige b. a y b se mantienen en secreto.
  3. Cálculo de claves públicas:
    • Alicia calcula A = g^a mod p.
    • Bob calcula B = g^b mod p.
    • A y B son claves públicas y pueden ser enviadas de forma segura a través de un canal abierto.
  4. Cálculo de la clave secreta compartida:
    • Alicia recibe B de Bob y calcula la clave secreta compartida S = B^a mod p.
    • Bob recibe A de Alicia y calcula la misma clave secreta S = A^b mod p.

Matemáticamente (g^b mod p)^a mod p = g^(b*a) mod p y (g^a mod p)^b mod p = g^(a*b) mod p. Como a*b = b*a, ambas partes calculan el mismo valor S, que se convierte en su clave secreta compartida.

# Ejemplo en Python
import random

# 1. Selección de parámetros públicos (en la práctica, números mucho mayores)
p = 23
g = 5

print(f"Parámetros públicos: p = {p}, g = {g}")

# 2. Generación de números secretos
a = random.randint(2, p - 2) # Número secreto de Alicia
b = random.randint(2, p - 2) # Número secreto de Bob

print(f"Número secreto de Alicia: {a}")
print(f"Número secreto de Bob: {b}")

# 3. Cálculo de claves públicas
A = pow(g, a, p) # Clave pública de Alicia: g^a mod p
B = pow(g, b, p) # Clave pública de Bob: g^b mod p

print(f"Clave pública de Alicia: {A}")
print(f"Clave pública de Bob: {B}")

# 4. Cálculo de la clave secreta compartida
# Alicia calcula: B^a mod p
shared_key_alice = pow(B, a, p)

# Bob calcula: A^b mod p
shared_key_bob = pow(A, b, p)

print(f"Clave secreta compartida (Alicia): {shared_key_alice}")
print(f"Clave secreta compartida (Bob): {shared_key_bob}")

# Verificación: las claves deben coincidir
print(f"¿Las claves coinciden? {shared_key_alice == shared_key_bob}")

Tras el intercambio de claves exitoso, ambas partes pueden usar el valor S obtenido como clave para algoritmos de cifrado simétrico (por ejemplo, AES, DES) para cifrar y descifrar mensajes posteriormente. El Diffie-Hellman no realiza cifrado de datos. Resuelve el problema de su intercambio seguro para el cifrado simétrico posterior.