Tenga en cuenta que incluso los cifrados y MAC ingenuos (es decir, Encrypt(M, k) || MAC(M, K)
) tienen una vulnerabilidad. Si el atacante conoce una cantidad de texto sin formato posible que el mensaje podría contener, entonces pueden averiguar el contenido de un mensaje comparándolo con el hash de MAC del texto sin formato conocido. El Encrypt-and-Hash también sufre la misma vulnerabilidad, y es mucho más fácil, ya que el atacante puede generar sus propios hash calculando el hash de textos similares en lugar de tener que interceptar mensajes pasados con contenido idéntico.
Por ejemplo, si sabes que Alice siempre le envía un mensaje a Bob cada una de las tres a las tres posibles opciones de café: "El café de hoy es Cappuccino / Black / Moccacino", entonces si el hash del mensaje coincide con uno de ellos, lo harías Conozca la elección de café de Alice.
Con MAC, deberá coincidir con un texto sin formato conocido anterior o un "oráculo" (que puede generar mensajes cifrados con el texto sin formato elegido). Esto se denomina ataque de texto sin formato elegido .
La mejor práctica actualmente aceptada es cifrar y luego MAC (es decir, Encrypt(M, k) || MAC(Encrypt(M, k), K)
).
Entonces, la pregunta es: ¿por qué no reemplazar esto con Encrypt-then-hash: Encrypt(M, k) || Hash(Encrypt(M, k))
es obvio? Dado que cualquiera puede calcular el hash de la parte cifrada, este hash no proporciona autenticación.
Bonificación: Otra posible construcción es MAC-then-Encrypt (es decir, Encrypt(MAC(M, K), k)
), esto es vulnerable a los ataques que modificaron el texto cifrado, lo que probablemente producirá basura en el servidor y será rechazado debido a un hash incorrecto, pero puede Aún así proporcionar información útil para el atacante. Uno de estos ataques es el ataque oracle de relleno . Hash-then-Encrypt es vulnerable al mismo ataque.
Sugiero leer sobre los temas de cifrado autenticado o cifrado autenticado con datos asociados.