Si noti che persino Enifypt-and-MAC (cioè Encrypt(M, k) || MAC(M, K)
) ha vulnerabilità. Se l'autore dell'attacco conosce un certo numero di possibili testi in chiaro che il messaggio potrebbe eventualmente contenere, allora può capire il contenuto di un messaggio confrontandolo con il MAC / hash di testo in chiaro noto. Anche Encrypt-and-Hash soffre della stessa vulnerabilità, ed è molto più semplice poiché l'attaccante può generare i propri hash calcolando l'hash di testi simili piuttosto che dover intercettare messaggi precedenti con contenuti identici.
Ad esempio, se sai che Alice invia sempre a Bob un messaggio ogni 6AM una delle tre possibili scelte di caffè: "Il caffè di oggi è Cappuccino / Nero / Moccacino", quindi se l'hash del messaggio corrisponde a uno di questi, si conosci la scelta del caffè di Alice.
Con MAC, dovrai abbinarlo a un testo in chiaro noto precedente oa un "oracle" (che può generare messaggi crittografati con il testo in chiaro scelto). Questo è chiamato attacco di testo normale scelto .
La best practice attualmente accettata è Encrypt-then-MAC (cioè Encrypt(M, k) || MAC(Encrypt(M, k), K)
).
Quindi la domanda diventa, perché non sostituirla con Encrypt-then-hash: Encrypt(M, k) || Hash(Encrypt(M, k))
è ovvio. Poiché chiunque può calcolare l'hash della parte crittografata, questo hash in realtà non fornisce l'autenticazione.
Bonus: un'altra possibile costruzione è MAC-then-Encrypt (cioè Encrypt(MAC(M, K), k)
), questo è vulnerabile agli attacchi che modificano il testo crittografato, che probabilmente produrrà spazzatura sul server e verrà rifiutato a causa dell'hash non corretto, ma può ancora fornire informazioni utili all'attaccante. Uno di questi attacchi è il riempimento di oracle attack . Hash-then-Encrypt è vulnerabile allo stesso attacco.
Suggerisco di leggere gli argomenti della crittografia autenticata o della crittografia autenticata con i dati associati.