¿Debo usar un vector de inicialización (IV) junto con mi encriptación?

¿Se recomienda utilizar un vector de inicialización para cifrar / descifrar mis datos? ¿Hará las cosas más seguras? ¿Es una de esas cosas que debe evaluarse caso por caso?

Para poner esto en contexto real, la función Criptografía Win32, CryptSetKeyParam permite la configuración de un vector de inicialización en una clave antes de cifrar / descifrar. Otras API también permiten esto.

¿Qué se recomienda generalmente y por qué?

Una IV es esencial cuando alguna vez se puede usar la misma clave para encriptar más de un mensaje.

La razón es porque, en la mayoría de los modos de cifrado, dos mensajes cifrados con la misma clave se pueden analizar juntos. En un cifrado de flujo simple, por ejemplo, XORing dos textos cifrados cifrados con la misma clave dan como resultado el XOR de los dos mensajes, a partir de los cuales se puede extraer fácilmente el texto sin formato con las técnicas tradicionales de criptoanálisis.

Una IV débil es parte de lo que hizo que WEP se pudiese.

Un IV básicamente mezcla algunos datos únicos y no secretos en la clave para evitar que la misma clave se use dos veces.

En la mayoría de los casos, debes usar IV. Como IV se genera aleatoriamente cada vez, si encriptas los mismos datos dos veces, los mensajes cifrados serán diferentes y será imposible para el observador decir si estos dos mensajes son iguales.

Eche un buen vistazo a una imagen (ver a continuación) del modo CBC. Pronto se dará cuenta de que un atacante que conoce la IV es como si el atacante conociera un bloque anterior de texto cifrado (y sí, ya lo saben).

Esto es lo que digo: la mayoría de los “problemas” con IV = 0 son problemas generales con los modos de encriptación de bloques cuando no se garantiza la integridad de los datos. Usted realmente debe garantizar la integridad.

Esto es lo que hago: use una sum de comprobación sólida (hash criptográfico o HMAC) y anteponga a su texto plano antes de cifrar. Está su primer bloque de texto cifrado conocido: es el IV de la misma cosa sin la sum de comprobación, y necesita la sum de comprobación por un millón de otras razones.

Finalmente: cualquier analogía entre CBC y cifrado de flujo no es terriblemente perspicaz en mi humilde opinión.

Solo mira la imagen del modo CBC, creo que estarás gratamente sorprendido.

Aquí hay una foto:

http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation

Texto del enlace

Encontré que la descripción de HTTP Digest Auth ( RFC 2617 ) es muy útil para comprender el uso y la necesidad de IVs / nonces.

Si la misma clave se usa varias veces para múltiples patrones de secretos diferentes, podría surgir en los resultados cifrados. El IV, que debe ser pseudo aleatorio y usarse solo una vez con cada tecla, está ahí para ocultar el resultado. Nunca debe usar el mismo IV con la misma llave dos veces, eso sería contrario al propósito de la misma.

Para no tener que molestarse en hacer un seguimiento del IV, lo más simple es anteponer, o anexarlo, al secreto encriptado resultante. De esa forma no tienes que pensar mucho al respecto. Entonces sabrá siempre que el primero o el último N bits es el IV.

Al descifrar el secreto, solo debes dividir el IV y luego usarlo junto con la clave para descifrar el secreto.

¿Es una de esas cosas que debe evaluarse caso por caso?

Sí lo es. Siempre lea sobre la cifra que está usando y cómo espera que se vean sus entradas. Algunas cifras no usan IV pero sí requieren sales para estar seguros. IVs pueden ser de diferentes longitudes. El modo del cifrado puede cambiar para qué se usa el IV (si se usa) y, como resultado, ¿qué propiedades necesita para ser seguro (aleatorio, único, incremental?).

En general, se recomienda porque la mayoría de la gente está acostumbrada a usar AES-256 o cifrados de bloque similares en un modo llamado “Cifrado de encadenamiento de bloques”. Esa es una buena y sensata opción predeterminada para muchos usos de ingeniería y necesita que tengas una IV adecuada (no repetitiva). En ese caso, no es opcional.

El IV permite que el texto en claro sea encriptado de manera tal que el texto encriptado sea más difícil de descifrar para un atacante. Cada bit de IV que use duplicará las posibilidades de texto cifrado de un texto simple dado.

Por ejemplo, encriptemos ‘hello world’ usando un IV carácter largo. El IV se selecciona al azar para ser ‘x’. El texto que luego se cifra es ‘xhello world’, que dice, ‘asdfghjkl’. Si lo encriptamos nuevamente, primero generemos un nuevo IV, digamos que obtenemos ‘b’ esta vez, y encriptamos como lo normal (encriptando ‘bhello world’). Esta vez tenemos ‘qwertyuio’.

El punto es que el atacante no sabe qué es el IV y, por lo tanto, debe calcular cada IV posible para un texto plano dado para encontrar el texto de cifrado coincidente. De esta forma, el IV actúa como una contraseña . Más comúnmente, una IV se usa con un cifrado de encadenamiento (ya sea una secuencia o un cifrado de bloque). En un cifrado de bloques de encadenamiento, el resultado de cada bloque de texto sin formato se alimenta al algoritmo de cifrado para encontrar el texto de cifrado para el siguiente bloque. De esta forma, cada bloque está encadenado.

Entonces, si tiene una IV aleatoria utilizada para encriptar el texto plano, ¿cómo lo descifra? Sencillo. Pase el IV (en texto sin formato) junto con su texto encriptado. Usando nuestro ejemplo anterior, el texto de cifrado final sería ‘xasdfghjkl’ (IV + texto cifrado).

Sí, debes usar un IV, pero asegúrate de elegirlo correctamente. Use una buena fuente de números aleatorios para hacerlo. Nunca use el mismo IV dos veces. Y nunca use una IV constante.

El artículo de Wikipedia sobre vectores de inicialización proporciona una descripción general.