Tengo un caso interesante con respecto a la protección contra ataques de repetición. Bajo el supuesto de que Alice y Bob han usado el intercambio de claves Diffie-Hellman para establecer una sesión temporal segura, ¿sería seguro para ellos usar la parte pública de sus claves DH como sembradoras no asociadas en combinación con HMAC para protegerse de los ataques de repetición? En pseudo código -
Estableciendo una sesión:
a:
(dhA, dhSecret) = DH_GEN(common)
a->b (dhA)
b:
(dhB, dhSecret) = DH_GEN(common)
b->a (dhB)
a:
a<-b (dhB)
sessionKey = DH_KEY(dhB, dhSecret)
b:
b<-a (dhA)
sessionKey = DH_KEY(dhA, dhSecret)
Ahora, cuando Alice quiere enviar algunos datos a Bob:
a:
data = ENCRYPT(sessionKey, data)
dhA++
hmac = HMAC(sessionKey, data | dhA)
a->b (data, hmac)
Y en el lado de Bob, el proceso se invierte:
b:
b<-a (data, hmac)
if (hmac == HMAC(sessionKey, data | dhA+1)) {
dhA++
data = DECRYPT(sessionKey, data)
}
Lo mismo sucede en la dirección opuesta:
b:
data = ENCRYPT(sessionKey, data)
dhB++
hmac = HMAC(sessionKey, data | dhB)
b->a (data, hmac)
a:
a<-b (data, hmac)
if (hmac == HMAC(sessionKey, data | dhB+1)) {
dhB++
data = DECRYPT(sessionKey, data)
}
Y la segunda pregunta: ¿sería más fácil y seguro usar un nonce auto-incremental a partir de un número fijo (digamos 0) en lugar de usar claves públicas DH bastante grandes para el nonce inicial?
¿Cuáles son los peligros (si los hay) de tal enfoque, aparte de un posible ataque MITM durante el establecimiento de la sesión que se puede frustrar usando algún tipo de KE Diffie-Hellman autenticado (por ejemplo, tener las claves públicas generadas firmadas por certificados de confianza durante el intercambio)?
Gracias