¿Cuál es el punto del nonce en el modo CTR?

5

¿Tener un nonce en modo CTR realmente mejora la seguridad (en comparación con el uso de 1, 2, 3, etc., básicamente un nonce constante de 0)?

Por lo que puedo decir, el mejor de los casos en cuanto a seguridad es que el nonce podría actuar como una especie de segunda clave, que también se compartiría de forma segura entre las partes que se comunican. Pero si el cifrado del bloque subyacente es seguro (digamos AES-128), debería ser innecesario e inútil ... ¿verdad?

Me parece que especificar un nonce solo da una falsa sensación de seguridad agregada. ¿Me estoy perdiendo algo?

    
pregunta Neil Fitzgerald 15.07.2014 - 21:07
fuente

2 respuestas

17

El "nonce" es mejor conocido como el Vector de inicialización - con "IV" como el nombre corto universal para ese concepto El modo CTR funciona cifrando los valores sucesivos de un contador (CTR significa "CounTeR"), por lo que el IV en el modo CTR es simplemente el valor en el que comienza el contador.

CTR básicamente produce una secuencia pseudoaleatoria larga dependiente de la clave, y el cifrado se produce al XORing esa secuencia con los datos para cifrar; en ese sentido, es muy similar a Pad de una sola vez , excepto que la secuencia de claves se genera con AES ( como un tipo de PRNG): esto anula la grandeza matemática de la OTP, es decir, su seguridad absoluta, pero hace que el esquema sea utilizable en la práctica.

Usar un IV de valor cero está bien ... siempre y cuando lo hagas solo una vez. Si reutiliza un valor de contador (con la misma clave) para otra ejecución, terminará con lo mismo que OTP donde el "pad" no es "una sola vez". Esta es una ruptura clásica. La idea es que, para una clave dada , debe considerar cada valor de contador como "quemado" cada vez que lo use. Si realiza una primera ejecución de encriptación comenzando con el valor de contador 0, entonces utilizará los valores de contador 0 para, digamos, 12782 (por ejemplo, si los datos encriptados de ese tiempo tenían una longitud de 276525 bytes). Si no cambia la clave, NO DEBE reutilizar ninguno de los valores de contador 0 a 12782. La siguiente ejecución de cifrado con esa clave debe comenzar con IV = 12783.

Por el contrario, mantener una IV de valor 0 siempre estará seguro siempre que use la tecla AES una sola vez. Esto tendría sentido en un protocolo similar a SSL, donde una clave de cifrado específica de la conexión se negocia durante un saludo inicial, se usa para esa conexión y luego se elimina para siempre.

Más generalmente, la mayoría de los modos de operación para el cifrado de bloque usan un IV (porque tienen algún "estado de ejecución" que debe comenzar en algún lugar), y los requisitos para estos IV dependen del modo. CTR puede tolerar un IV fijo si nunca reutiliza la clave para otra ejecución. CBC ni siquiera tolera eso, porque se puede aprovechar un IV predecible para los ataques de texto sin formato elegido.

    
respondido por el Thomas Pornin 15.07.2014 - 21:20
fuente
1

Esta es una suposición aleatoria ya que no soy un experto ...

Para responder a la pregunta del título, "¿Cuál es el motivo de la falta en el modo CTR?", diría que es hacer que el protocolo sea sin estado . Lo que significa que ambos lados no necesitan almacenar ninguna información para cifrar / descifrar múltiples ejecuciones, excepto la clave.

Para entender la declaración anterior, veamos el cifrado de bloque y algunos protocolos como SSL.

Un cifrado de bloque es como una función con dos argumentos, clave y entrada. Si proporciona los mismos dos argumentos (clave + entrada) dos veces, siempre producirá la misma salida.

En SSL, genera una clave simétrica al principio que utilizará para cifrar / descifrar muchos mensajes diferentes. Por lo tanto, uno de sus argumentos en el cifrado de bloque ya está arreglado para toda la conversión. Esto significa que nunca debe repetir el segundo o producirá la misma salida del cifrado de bloque dos veces.

¿Por qué es malo producir el mismo resultado del cifrado de bloque dos veces?

Es malo porque te hace vulnerable a los ataques de repetición. Si está bien generar el mismo resultado del cifrado de bloque dos veces, significa que está permitido que un atacante vuelva a enviar uno de sus mensajes antiguos durante la conversación y el servidor lo aceptará con gusto.

Entonces, ¿es por eso que necesitamos un nonce?

Sí y no.

Si ha corregido el error, está bien siempre y cuando nunca reutilice la misma clave con el mismo contador durante toda la conversación, lo que puede incluir muchos mensajes. Por lo tanto, tanto el cliente como el servidor necesitan saber el último valor del contador, por lo tanto, necesitarían mantener un estado.

Al utilizar un nonce, asumimos que nunca tendremos la misma entrada que está formada por la combinación del nonce y el contador. Por lo tanto, no necesitamos mantener ningún estado.

    
respondido por el Gudradain 15.07.2014 - 22:06
fuente

Lea otras preguntas en las etiquetas