¿El protocolo de intercambio de claves Diffie-Hellman es vulnerable al hombre en el ataque central? Si es así, ¿qué tipo de MITM es ese? Creo que es un ataque de repetición o un ataque de relevo, aunque no estoy seguro.
Es vulnerable en una versión. Para ser más claros, las tres versiones básicas de Diffie-Hellman son:
DH anónimo, donde Alice y Bob simplemente se envían valores sin firmar;
DH fijo (a veces llamado simplemente DH);
DH efímero (ver más abajo).
El DH anónimo es fácilmente vulnerable a un ataque MitM, de la siguiente manera.
Alice genera un valor X, Bob genera Y, Eve genera Z.
Alice envía g ^ X mod p. Eve intercepta el mensaje y lo cambia con g ^ Z (su propio valor aleatorio) mod p, antes de enviarlo a Bob.
Bob ahora cree que Alice le ha enviado g ^ Z mod p, ya que no hay firma ni ningún otro mecanismo de autenticación.
Bob envía g ^ Y mod p. Eve intercepta el mensaje, lo cambia con g ^ Z mod p y lo envía a Alice.
Alice ahora calcula (g ^ Z mod p) ^ X mod p.
Bob ahora calcula (g ^ Z mod p) ^ Y mod p.
Eve calcula (g ^ X mod p) ^ Z mod p, que es su secreto con Alice, y (g ^ Y mod p) ^ Z mod p, que es su secreto con Bob.
Alice encripta "Te quiero" con (g ^ X mod p) ^ Z mod p.
Esa clave se acordó con Eve, para que Eve pueda descifrar el mensaje, cambiarlo a "Te odio" y volver a cifrarlo con su secreto con Bob. En otras palabras, Eve puede actuar como un proxy al acordar una clave diferente con Alice y Bob.
Esto se puede evitar utilizando el DH fijo - donde g ^ X y g ^ Y están firmados por un CA de confianza - o, mejor aún, por un Ephemeral DH.
En Ephemeral DH (DHE) X, Y se cambian cada vez, es decir, en cada sesión. También están firmados, para prevenir MitM. Sin embargo, como siempre cambian y la firma cambia con el mensaje firmado, ¿cómo puede la otra parte verificar la autenticidad de la firma?
La solución DHE es simple: use un certificado. Si Alice puede firmar su propia g ^ X con una clave privada y probar que la clave pública correspondiente está asociada a ella, a través de un certificado, Bob puede verificar el certificado y, al hacerlo, verificar la identidad de Alice y, por lo tanto, la autenticidad de su g. ^ X.
Por lo tanto, DHE funciona así.
Más formalmente, el certificado es Cert_Alice = (Alice, PKAlice) _CA, lo que significa que contiene la clave pública de Alice PKAlice y está firmado por la CA.
Lo mismo hace Bob, que obtiene un certificado similar.
Alice genera X y calcula g ^ X mod p.
Alice luego envía dos mensajes a Bob, M1 = (g ^ X mod p, PKAlice) _Alice (firmado por Alice) y M2 = Cert_Alice.
Bob verifica que M2 realmente ha sido firmado por la CA de confianza (utilizando la PKCA conocida para ver si el mensaje firmado coincide con la firma), y que realmente pertenece a Alice.
Si M2 ha pasado las pruebas anteriores, significa que ha sido enviado por Alice (a menos que alguien haya robado la clave privada de Alice y el certificado aún sea válido). En este punto, Bob usa la PKAlice certificada, que estaba dentro de M2, para verificar la firma de M1. Si todo está bien, Bob almacena g ^ X mod p.
Bob genera Y y calcula g ^ Y mod p.
Bob luego envía dos mensajes a Alice, M3 = (g ^ Y mod p, PKBob) _Bob (firmado por Bob) y M4 = Cert_Bob.
Alice verifica la validez de M4 (ver 4).
Si M4 se ha verificado completamente, Alice usa el PKBob certificado, que estaba dentro de M4, para verificar la firma de M3. Si todo está bien, Alice almacena g ^ Y mod p.
Alice y Bob calculan por separado (g ^ Y mod p) ^ X mod p == (g ^ X mod p) ^ Y mod p.
En cada nueva sesión, reinicie desde 2.
Por supuesto, el uso de mensajes firmados después del intercambio de DH permitiría detectar inmediatamente que algo extraño ha sucedido, pero no hay nada en el DH anónimo que prevenga los ataques MitM.
Lea otras preguntas en las etiquetas attacks man-in-the-middle diffie-hellman