¿Debería AES dar siempre la misma salida?

18

Tengo problemas para entender AES y me gustaría saber si cifrar el mismo texto con la misma clave dos veces seguidas debería dar el mismo resultado.

¿Hay alguna sal o algo que pueda cambiar la salida?

Si no da lo mismo, ¿cómo podría uno descifrar el mensaje (con la clave) si la sal es aleatoria y no lo sabe?

Si da lo mismo, ¿podrían usarse tablas de arco iris para recuperar el mensaje?

    
pregunta user31008 19.09.2013 - 09:01
fuente

2 respuestas

23

Un código de bloque como AES es una permutación con clave. En el caso de AES, toma una clave y luego convierte un bloque de 16 bytes en otro bloque de 16 bytes de manera determinista.

Para cifrar algo con un cifrado de bloques, debe usar el modo de operación . Por lo general, esos modos toman una IV (similar a una sal) que debería ser diferente para cada mensaje que cifres. Esta diferencia en el IV conduce a un mensaje cifrado totalmente diferente. Cifrar el mismo mensaje con el mismo IV y la clave devuelve siempre el mismo texto cifrado. Cifrar varios mensajes con el mismo IV y la clave debilita la seguridad, pero la cantidad depende del modo.

Las propiedades requeridas para un IV dependen del modo elegido, a veces debe ser único (por ejemplo, para el modo CTR), a veces tiene que ser aleatoriamente impredecible (por ejemplo, para el modo CBC). Pero generalmente no tiene que ser secreto, por lo que lo envía al destinatario junto con el texto cifrado, generalmente como un prefijo.

Hay algunos modos diseñados para el cifrado determinístico. Usando esos modos, todavía tienes fugas si dos mensajes son iguales, pero nada más. Solo debes usar esos modos cuando requieras determinismo.

    
respondido por el CodesInChaos 19.09.2013 - 10:49
fuente
12

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.

    
respondido por el Tom Leek 19.09.2013 - 13:27
fuente

Lea otras preguntas en las etiquetas