Suponga que encripta dos mensajes con la misma clave, y los dos mensajes comienzan con los mismos 16 bytes de texto sin formato. (16 bytes es el tamaño de bloque para AES, independientemente del tamaño de la clave). ¿El primer bloque de texto cifrado será el mismo? Si es así, ya estás filtrando algo de información al atacante. Si esta información es confidencial o no depende de su aplicación, pero ya es una mala señal. Si el cifrado pierde más que el signo de los mensajes, no está haciendo su trabajo.
La idea básica de un IV es anteponer un poco de contenido aleatorio a cada mensaje, de una manera basada en principios. Cómo funciona esto depende precisamente del modo. (La operación AES principal solo funciona en bloques de 16 bytes. Un modo es una forma de extender esto a mensajes más largos). Por ejemplo, con CBC , el cifrado de cada bloque se calcula a partir de la clave, el bloque de texto plano y el texto cifrado del bloque anterior; para el primer bloque, se utiliza el IV en lugar del texto cifrado del bloque anterior inexistente. Normalmente, la IV se envía en texto claro junto con el texto cifrado, por lo general, se envía a los primeros 16 bytes del mensaje cifrado.
El modo
CTR utiliza técnicamente un contador y no un IV, pero operacionalmente funcionan de manera muy similar : el remitente genera un valor aleatorio de 16 bytes al azar y se envía al comienzo del mensaje cifrado. Con el modo CTR, reutilizar ese valor para otro mensaje es catastrófico, porque CTR funciona al XORAR el texto sin formato con una secuencia pseudoaleatoria deducida de la clave y el contador. Si tiene dos mensajes encriptados que usan el mismo valor de contador, su XOR es el XOR de los dos colores.
Hay más ataques contra los IV elegidos incorrectamente de los que he enumerado aquí. Genere un IV aleatorio para cada mensaje (utilizando un generador aleatorio de calidad criptográfica, el mismo que usaría para generar una clave), y estará bien.
Hay una excepción: si genera una clave nueva para cada mensaje, puede elegir un IV predecible (todos los bits 0 o lo que sea). Aún necesita usar un modo con un IV (el BCE no está bien, por ejemplo, expone las repeticiones en el texto simple ya que dos bloques de entrada idénticos tendrán el mismo cifrado). Sin embargo, ese es un caso raro (surge para el almacenamiento, no para la comunicación).
Tenga en cuenta que el cifrado a priori solo garantiza la confidencialidad de los datos, no su integridad. Dependiendo de lo que haga con los datos, esto puede ser un problema. En particular, si un atacante puede enviar textos cifrados tentativos para ser descifrados, o puede proporcionar textos adicionales para encriptar, esto puede exponer cierta información. Algunos modos, como EAX y GCM proporciona cifrado autenticado : un texto cifrado solo se descifra si es genuino. Usa uno de estos si es posible.
Tenga en cuenta también que AES-128 es tan seguro en la práctica como AES-256 .
Si no te sientes cómodo con lo que estás haciendo, intenta usar una biblioteca de alto nivel en lugar de lidiar directamente con la criptografía.