AES es un cifrado de bloque : toma como entrada un bloque (16 bytes, en el caso de AES) y una clave (16, 24 o 32 bytes, para AES), y genera otro bloque (de nuevo, 16 bytes). Es un algoritmo completamente determinista, completamente especificado, y todos en el mundo deberían obtener el mismo bloque de salida para el mismo bloque de entrada y clave.
Sin embargo, no encripta un bloque, encripta un mensaje . El cifrado de bloque es solo un elemento de construcción; el cifrado real utiliza un modo de operación que invoca el cifrado de bloque repetidamente. Hay buenos modos, y hay malos modos; el objetivo es lograr la confidencialidad del mensaje en su conjunto y no filtrar información parcial, por ejemplo, si dos partes del mensaje son iguales entre sí. En particular, si queremos cifrar dos mensajes con la misma clave, generalmente no queremos revelar si los dos mensajes fueron idénticos o no, por lo que algo tiene que cambiar, en algún lugar, entre los dos cifrados .
La mayoría de los modos de operación utilizan un vector de inicialización que es donde se inyecta el no determinismo. Algunos modos (por ejemplo, GCM o EAX ) requiere solo un IV no repetitivo; un contador puede estar bien para ellos y puede estar implícito en algún contexto (por ejemplo, cuando hay mensajes sucesivos en un flujo de comunicación dado, el número del mensaje puede servir como IV). Algunos otros modos, especialmente CBC, son seguros en general, solo si la IV se elige al azar, uniformemente, con un fuerte PRNG , y el siguiente IV a utilizar aún no se conoce cuando se eligen los datos de texto sin formato. El incumplimiento de todos estos requisitos ha sido la fuente de muchos problemas, por ejemplo, el ataque BEAST en SSL .
Entonces, se podría decir que el cifrado simétrico seguro requiere al menos memoria (por ejemplo, para recordar un valor de contador) o aleatoriedad . La "memoria" puede ser un contador mundial común (por ejemplo, la hora actual, ¡pero tenga cuidado con los ajustes del reloj!).
Si está preparado para tolerar la pequeña pérdida sobre si dos mensajes de entrada dados son idénticos o no, entonces es posible tener una memoria totalmente determinista, sin memoria sistema de cifrado, pero no será compatible con el cifrado transmitido (debe mantener todo el mensaje en la memoria durante el proceso). Básicamente, calcula un algoritmo determinista de MAC sobre el mensaje (como HMAC ) y utiliza su salida como IV. Este es un algoritmo de dos pasadas, y eso es bastante inevitable. Si dos mensajes de origen son idénticos, producirán el mismo mensaje cifrado, pero si difieren en cualquier lugar (incluso en su último bit), entonces, con alta probabilidad, los mensajes cifrados serán completamente diferentes.
Desafortunadamente, las plataformas para las que la memoria y / o la aleatoriedad son requisitos difíciles (por ejemplo, las tarjetas inteligentes) también son plataformas en las que la memoria RAM es una ventaja, y un sistema de dos pasos puede ser demasiado caro.