Ho un caso interessante riguardante la protezione dagli attacchi di replay. Partendo dal presupposto che Alice e Bob hanno utilizzato lo scambio di chiavi Diffie-Hellman per stabilire una sessione temporanea sicura, sarebbe sicuro per loro utilizzare la parte pubblica delle loro chiavi DH come seeders nonce in combinazione con HMAC per proteggere dagli attacchi di replay? In pseudo codice -
Stabilire una sessione:
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)
Ora, quando Alice vuole inviare alcuni dati a Bob:
a:
data = ENCRYPT(sessionKey, data)
dhA++
hmac = HMAC(sessionKey, data | dhA)
a->b (data, hmac)
E sul lato di Bob il processo è invertito:
b:
b<-a (data, hmac)
if (hmac == HMAC(sessionKey, data | dhA+1)) {
dhA++
data = DECRYPT(sessionKey, data)
}
La stessa cosa accade nella direzione opposta:
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)
}
E la seconda domanda: sarebbe più facile e altrettanto sicuro usare un nonce autoincrementante a partire da un numero fisso (per esempio 0) invece di usare chiavi pubbliche DH piuttosto grandi per il nonce iniziale?
Quali sono i pericoli (se ce ne sono) di tale approccio, a parte un possibile attacco MITM durante la sessione stabilita che può essere contrastato usando qualche forma di Diffie-Hellman KE autenticato (ad esempio con le chiavi pubbliche generate firmate da certificati attendibili durante lo scambio)?
Grazie