Diffie-Hellman explicado: cómo dos desconocidos crean un secreto a la vista de todos — Miquel Puig
Imagina que tú y alguien a quien no conoces tenéis que poneros de acuerdo en una contraseña secreta. Con una dificultad añadida: toda la conversación será a gritos delante de todo el mundo, donde además hay un espía que anota todo lo que decís.
A primera vista parece imposible: si el espía oye toda la conversación, también conocerá la contraseña. Y sin embargo, esto es lo que se consigue hacer cada vez que abres una web con HTTPS.
El truco se llama intercambio de claves Diffie-Hellman, y en este artículo vamos a desmontarlo hasta el punto de que puedas reproducirlo con lápiz y papel. Sin milagros: solo aritmética con una asimetría muy bien elegida.
El dilema de compartir un secreto
El cifrado más rápido y común es simétrico: la misma clave sirve para cifrar y para descifrar (AES es el ejemplo canónico). Es estupendo salvo por un detalle incómodo: las dos partes necesitan compartir esa clave antes de empezar. ¿Y cómo la comparten si el único canal disponible está espiado? Mandarla en claro es absurdo.
Hasta 1976, la respuesta era logística: mensajeros, sobres lacrados, un canal seguro previo. Es el llamado problema de distribución de claves. Lo que hicieron Whitfield Diffie y Martin Hellman en su artículo «New Directions in Cryptography» (IEEE Transactions on Information Theory, noviembre de 1976) fue demostrar algo que parecía contradictorio: que dos partes pueden generar una clave común a la vista de todos, sin haberla transmitido jamás.
El secreto está en la mezcla
Para entender la idea, imaginemos que Alice y Bob trabajan con pinturas:
Alice y Bob acuerdan en público un color base, por ejemplo, amarillo. El espía también lo conoce.
Cada uno elige en secreto un color propio que no revela a nadie.
Ambos mezclan su color secreto con el amarillo y se intercambian la mezcla. El espía ve pasar los recipientes, pero no sabe qué color secreto contiene cada uno.
Después, cada uno añade su propio color secreto a la mezcla recibida del otro. Aunque ninguno conoce el color del otro, ambos terminan con exactamente la misma mezcla final.
- El espía dispone del color base y de las dos mezclas intermedias, pero se enfrenta a un problema: una vez mezcladas las pinturas, recuperar los colores originales es prácticamente imposible. Puede observar todo el proceso, pero nunca reconstruir el resultado final.
Ahí está la clave. Mezclar pinturas es muy fácil; deshacer la mezcla no lo es. Esa asimetría —una operación sencilla en un sentido y extremadamente difícil en el contrario— es lo que en criptografía se comporta como una función unidireccional. (Un matiz importante: que estas funciones existan de verdad no está demostrado; es una conjetura bien fundada, no un teorema. Por eso se dice que un problema se supone unidireccional, no que lo sea con certeza.) En Diffie-Hellman, el papel de mezclar pinturas lo desempeña la exponenciación modular.
Analogía de la mezcla de pinturas
De las pinturas a los números
Las pinturas solo eran una analogía. En Diffie-Hellman no se mezclan colores, sino números. Para conseguir el mismo efecto se utiliza una operación matemática con una propiedad muy especial: es muy fácil de calcular, pero extremadamente difícil de invertir.
Esa operación es la exponenciación modular.
La aritmética del reloj
Antes de verla, necesitamos una idea muy sencilla: la aritmética modular, también conocida como aritmética del reloj.
En un reloj de 12 horas, las 10 más 5 no son las 15, sino las 3. Al llegar al 12, simplemente vuelves a empezar.
En matemáticas escribimos: 17 mod 12 = 5 porque al dividir 17 entre 12 el resto es 5.
En Diffie-Hellman ocurre exactamente lo mismo, solo que en lugar de un reloj de 12 horas se utiliza uno muchísimo más grande, normalmente con cientos o miles de bits.
El protocolo paso a paso
Todo el mundo conoce dos números públicos: p y g.
Alice elige un número secreto a y calcula:
A = g^a mod p
Después envía A a Bob.
Bob hace lo mismo con otro número secreto b:
B = g^b mod p
y envía B a Alice.
Ahora llega el momento clave.
Alice utiliza el número público de Bob (B) junto con su secreto (a) para calcular:
s = B^a mod p
Bob hace exactamente lo mismo con el número público de Alice (A) y su secreto (b):
s = A^b mod p
Ambos obtienen exactamente el mismo valor s, aunque ninguno conoce el secreto del otro. Ese número s es el secreto compartido: una clave que solo Alice y Bob pueden calcular, y que normalmente se utiliza para derivar la clave simétrica (por ejemplo, una clave AES) con la que cifrarán el resto de la comunicación.
La demostración matemática:
B^a = (g^b)^a = g^{ab} = (g^a)^b = A^b (mod p)
Observa el detalle fundamental: por el canal solo han viajado A y B. El valor s nunca se transmite, y tampoco lo hacen a, b ni el exponente ab. Cada participante calcula s por su cuenta utilizando su propio secreto y la información pública recibida.
La operación que lo hace posible
Ahora sí aparece la pieza clave.
Partimos de dos números públicos:
un número primo muy grande p, que determina el tamaño del "reloj";
un número g, llamado generador.
Con ellos cualquiera puede calcular: g^x mod p
Y aquí aparece la propiedad que buscamos.
Calcular g^x mod p es rápido, incluso cuando x tiene cientos de cifras.
Sin embargo, si solo conoces el resultado, recuperar x es extraordinariamente difícil. Ese problema recibe el nombre de logaritmo discreto.
Esa asimetría es exactamente el equivalente matemático de mezclar pinturas.
La matemática: la aritmética del reloj
Diffie-Hellman vive en la aritmética modular, que no es más que la aritmética del reloj. En un reloj, 10 + 5 no son 15, son las 3: al pasar de 12, vuelves a empezar. Escribimos a mod p para referirnos al resto de dividir a entre p; todo ocurre dentro del conjunto {0, 1, …, p−1}.
La operación estrella es la exponenciación modular: g^x mod p. Tiene la propiedad mágica que necesitamos:
Hacia delante es fácil. Calcular g^x mod p es rápido, incluso con números enormes, gracias a la exponenciación por cuadrados sucesivos.
Hacia atrás es inviable. Dado el resultado, recuperar el exponente x es el problema del logaritmo discreto, para el que no se conoce ningún método eficiente cuando los números son grandes.
El protocolo usa dos parámetros públicos: un primo grande p (el módulo, el "tamaño del reloj") y un generador g (la base). Con eso:
- Público:
p y g.
- Alice elige su clave privada
a, calcula su clave pública A = g^a mod p y envía A.
- Bob elige su privada
b, calcula su pública B = g^b mod p y envía B.
- Alice computa
s = B^a mod p. Bob computa s = A^b mod p.
Los dos llegan al mismo número porque el álgebra se lo permite:
B^a = (g^b)^a = g^{ab} = (g^a)^b = A^b (mod p)
El secreto compartido es s = g^{ab} mod p. Fíjate en el detalle clave: por el canal solo han viajado A y B. El exponente conjunto ab nunca se ha transmitido; cada uno lo completa con su mitad privada.
El ejemplo, con lápiz y papel
Hasta ahora hemos visto la idea, pero vamos con los números de verdad. Para que los cálculos quepan en una hoja de papel utilizaremos valores muy pequeños. En un sistema real serían muchísimo mayores, pero el funcionamiento es exactamente el mismo.
Los parámetros públicos serán: p = 23, g = 5.
| Paso |
Alice |
Bob |
| Clave privada (secreta) |
a = 6 |
b = 15 |
| Clave pública |
A = 5^6 mod 23 = 8 |
B = 5^15 mod 23 = 19 |
| Intercambio |
envía A = 8 → |
← envía B = 19 |
| Secreto |
s = 19^6 mod 23 = 2 |
s = 8^15 mod 23 = 2 |
Alice y Bob han llegado al mismo secreto (2) sin habérselo enviado nunca. Cada uno lo ha calculado utilizando su número secreto y la clave pública recibida del otro.
Ahora ponte en el lugar de Eve, la espía. Ella ha escuchado toda la conversación. Conoce p = 23, g = 5, A = 8 y B = 19. Lo único que no conoce son a y b.
¿Podría averiguar el secreto?
Con números tan pequeños, sí. Basta con probar valores hasta descubrir que 5^6 mod 23 = 8, así que a = 6. Pero este ejemplo está hecho para que puedas seguirlo con lápiz y papel.
En un intercambio real, p no tiene dos cifras, sino cientos o miles de bits. La misma estrategia dejaría de ser práctica: incluso utilizando todos los ordenadores disponibles, encontrar a o b llevaría muchísimo más tiempo del que lleva existiendo el universo.
Por qué es seguro: el logaritmo discreto
Formalmente, la seguridad de Diffie-Hellman descansa en el problema del logaritmo discreto (DLP): dados p, g y A = g^a mod p, hallar a. No se conoce ningún algoritmo clásico eficiente para un p grande y bien elegido; el mejor ataque general, el Number Field Sieve, es subexponencial pero impracticable a los tamaños recomendados. (En rigor, DH se apoya en un supuesto emparentado, el Diffie-Hellman computacional: calcular g^{ab} a partir de g^a y g^b sin conocer los exponentes.)
Un apunte muy práctico sobre tamaños. Según NIST SP 800-57, lograr unos 128 bits de seguridad exige un DH clásico (en cuerpo finito) de unos 3072 bits, frente a solo 256 bits si se usa criptografía de curva elíptica. Esa diferencia —misma seguridad con claves mucho más cortas— es la razón por la que el mundo se ha movido hacia las curvas, como veremos.
Diffie-Hellman solo resuelve una parte del problema
A estas alturas podría parecer que Diffie-Hellman sirve para cifrar mensajes. En realidad, no cifra absolutamente nada.
Su única función es conseguir que dos partes obtengan la misma clave secreta sin haberla compartido nunca. A partir de ahí entra en juego un algoritmo de cifrado simétrico, como AES-GCM o ChaCha20-Poly1305, que será el encargado de proteger los datos. Antes de utilizarla, además, esa clave suele pasar por una función de derivación como HKDF, que genera las claves finales de la sesión.
Pero todavía queda un problema.
Hasta ahora hemos supuesto que Alice realmente está hablando con Bob. ¿Y si no fuera así?
Imagina que un atacante, Mallory, consigue situarse entre ambos. Cuando Alice envía su clave pública, Mallory la intercepta y responde con la suya propia haciéndose pasar por Bob. Hace exactamente lo mismo con Bob, fingiendo ser Alice.
Al final se crean dos intercambios Diffie-Hellman independientes: uno entre Alice y Mallory, y otro entre Mallory y Bob. Mallory conoce ambos secretos compartidos, por lo que puede descifrar los mensajes, leerlos o modificarlos y volver a cifrarlos antes de reenviarlos. Ni Alice ni Bob tienen forma de darse cuenta.
Este es el clásico ataque de hombre en el medio (man-in-the-middle).
La solución no forma parte de Diffie-Hellman, sino que se añade por encima. Hay que demostrar que la clave pública realmente pertenece a quien dice pertenecer. En Internet eso se consigue mediante certificados digitales y firmas criptográficas. El servidor firma su clave pública, el navegador verifica esa firma y, solo entonces, acepta el intercambio.
Diffie-Hellman responde a una pregunta: ¿cómo compartimos un secreto?
Los certificados responden a otra: ¿cómo sé con quién lo estoy compartiendo?
Solo cuando ambas piezas trabajan juntas obtenemos una conexión realmente segura.
Claves efímeras: proteger el pasado
Si Alice y Bob generan claves privadas nuevas y aleatorias para cada sesión y las destruyen al terminar, hablamos de Diffie-Hellman efímero (DHE, o ECDHE en curvas elípticas). Esto proporciona una propiedad muy valiosa: el forward secrecy o secreto hacia adelante.
Imagina que un atacante graba hoy todo tu tráfico cifrado y mañana roba la clave privada del servidor. Con claves efímeras no podrá descifrar las sesiones pasadas, porque las claves utilizadas en ellas ya no existen. El ataque de "graba ahora, descifra después" se queda sin premio.
Por eso reutilizar claves (Diffie-Hellman estático) está desaconsejado, y por eso TLS 1.3 obliga a utilizar intercambios efímeros.
La evolución de Diffie-Hellman
El Diffie-Hellman de hoy rara vez usa el g^a mod p clásico. Usa ECDH, que es exactamente el mismo protocolo sobre otro escenario matemático: en lugar de exponentes sobre los enteros módulo p, se trabaja con puntos de una curva elíptica. La "exponenciación" pasa a ser una multiplicación de un punto a·G, y el problema difícil se vuelve el logaritmo discreto elíptico, más duro por bit —de ahí las claves cortas.
El método por defecto actual es X25519, un ECDH sobre la curva Curve25519 diseñada por Daniel J. Bernstein y estandarizado en RFC 7748. Es rápido, se implementa en tiempo constante (lo que frena los ataques que miden tiempos) y su diseño evita muchos errores clásicos de validación de parámetros. Hoy es el acuerdo de clave de facto en TLS 1.3, SSH moderno, Signal y WireGuard. (Si por algún motivo se necesita el DH clásico, hay que ceñirse a los grupos verificables de RFC 7919, nunca a primos caseros.)
En un handshake de TLS 1.3, el cliente ya incluye en su primer mensaje su aportación efímera (key_share) para grupos como x25519; el servidor responde con la suya, ambos derivan el secreto con HKDF, y el servidor se autentica con su certificado y una firma. Se eliminó el viejo transporte de clave con RSA (que no daba forward secrecy) y todo el intercambio cabe en una sola vuelta de red.
Cuando la teoría chocó con la realidad
Nada de esto es teórico. En 2015, el ataque Logjam (CVE-2015-4000) demostró cómo un man-in-the-middle podía degradar una conexión TLS a un Diffie-Hellman "de exportación" de 512 bits —un resto de los controles de exportación de criptografía de los años 90—. Roto ese logaritmo discreto pequeño, el atacante obtenía la clave de sesión.
La lección más inquietante del paper fue otra: en el DH clásico, el precómputo caro del Number Field Sieve depende solo del primo p. Como casi todo internet reutilizaba los mismos pocos primos de 1024 bits, un actor con recursos de Estado que rompiera uno podría espiar una fracción enorme del tráfico mundial. Los autores señalaron que esto encajaba con capacidades atribuidas a la NSA en las filtraciones de Snowden. La reacción de la industria: desactivar los grupos de exportación, subir a 2048 bits como mínimo y preferir ECDHE.
Un matiz para no confundir mitos: el famoso backdoor criptográfico probado, Dual_EC_DRBG, estaba en un generador de números aleatorios, no en Diffie-Hellman. El "problema de confianza" de DH es más sutil —de dónde salen los primos y el precómputo—, no una puerta trasera demostrada.
Un último dato curioso:
Hay un giro histórico fascinante. Lo que hoy conocemos como Diffie-Hellman ya había sido descubierto años antes, en secreto, dentro de la agencia británica GCHQ.
Hacia 1969, James Ellis concibió la idea del cifrado no secreto. Poco después, Clifford Cocks desarrolló un algoritmo equivalente a RSA, y en 1974 Malcolm Williamson descubrió un método de intercambio de claves esencialmente idéntico a Diffie-Hellman. Todo permaneció clasificado hasta 1997.
Mientras tanto, de forma completamente independiente, Whitfield Diffie y Martin Hellman publicaron su trabajo en 1976, revolucionando la criptografía moderna. Ralph Merkle había desarrollado ideas muy relacionadas, hasta el punto de que Hellman defendía que el protocolo debería llamarse Diffie-Hellman-Merkle.
James Ellis murió pocas semanas antes de que GCHQ desclasificara aquellos trabajos. Nunca llegó a saber que había sido uno de los primeros en imaginar la criptografía de clave pública.
El próximo desafío: la computación cuántica
Diffie-Hellman sigue siendo seguro frente a los ordenadores actuales. Sin embargo, un ordenador cuántico suficientemente grande podría ejecutar el algoritmo de Shor y resolver el problema del logaritmo discreto, tanto en su versión clásica como sobre curvas elípticas. (No debe confundirse con Grover, que afecta al cifrado simétrico reduciendo aproximadamente a la mitad su nivel de seguridad efectivo).
Por eso ya están apareciendo esquemas híbridos, que combinan X25519 con mecanismos poscuánticos como ML-KEM. Si en el futuro uno de los dos sistemas deja de ser seguro, el otro seguirá protegiendo el intercambio de claves.
Reflexión
Diffie-Hellman tampoco intenta hacerlo todo. Dentro de la criptografía es solo una pieza, pero una pieza esencial. Su única misión es conseguir que dos partes compartan un secreto. A partir de ahí entran en juego otros algoritmos, como AES, HKDF o los certificados digitales, que se encargan de cifrar, autenticar y proteger la comunicación. Al final, la seguridad de Internet no depende de un único algoritmo, sino de cómo todas esas piezas encajan entre sí.
Y quizá eso sea lo que más me gusta de la criptografía. Diffie-Hellman es solo una de esas piezas. Antes llegaron RSA y las matemáticas de los números primos; después las curvas elípticas; ahora los retículos de la criptografía poscuántica. Cambian las matemáticas, pero la idea es siempre la misma: encontrar operaciones que sean muy fáciles de hacer y extraordinariamente difíciles de deshacer.
Hay algo casi mágico en eso porque demuestra que las matemáticas esconden propiedades profundamente contraintuitivas. Y, al menos por ahora, buena parte de la seguridad de Internet se sostiene sobre una de ellas.
Miquel Puig Gibert — Fundador de Loboware | Barcelona