it-swarm-es.tech

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

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

Para poner esto en contexto real, la función de 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é?

37
Scott Saad

Un IV es esencial cuando se puede usar la misma clave para cifrar más de un mensaje.

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

Un IV débil es parte de lo que hizo que el WEP sea rompible.

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

25
Andrew

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

9
Serge Khorun

Eche un buen vistazo a una imagen (ver más abajo) del modo CBC. Rápidamente se dará cuenta de que un atacante que conoce el IV es como el atacante que conoce un bloque anterior de texto cifrado (y sí, ya saben mucho de eso).

Esto es lo que digo: la mayoría de los "problemas" con IV = 0 son problemas generales con los modos de cifrado de bloque cuando no asegura la integridad de los datos. Realmente debes garantizar la integridad.

Esto es lo que hago: usar una suma de verificación fuerte (hash criptográfico o HMAC) y anteponerlo a su texto sin formato antes de encriptar. Ahí está su primer bloque conocido de texto cifrado: es el IV de lo mismo sin la suma de verificación, y necesita la suma de verificación por un millón de otras razones.

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

Solo mire la imagen del modo CBC, creo que se sorprenderá gratamente.

Aquí hay una foto:

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

texto del enlace

5
Purfideas

Si la misma clave se usa varias veces para múltiples secretos diferentes, podrían surgir patrones en los resultados cifrados. El IV, que debería ser pseudoaleatorio y usarse solo una vez con cada tecla, está ahí para ofuscar el resultado. Nunca debe usar el mismo IV con la misma tecla dos veces, eso anularía su propósito.

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

Al descifrar el secreto, simplemente divide el IV y luego lo usa junto con la clave para descifrar el secreto.

2
Molibar

La descripción de HTTP Digest Auth ( RFC 2617 ) me pareció muy útil para comprender el uso y la necesidad de IV/nonces.

2
Peter Stone

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

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

En general, se recomienda porque la mayoría de las personas están acostumbradas a usar cifrados de bloque AES-256 o similares en un modo llamado 'Encadenamiento de bloque de cifrado'. Esa es una opción predeterminada buena y sensata para muchos usos de ingeniería y necesita que tengas un IV apropiado (no repetitivo). En ese caso, no es opcional.

1
Rushyo

El IV permite que el texto plano se cifre de manera que el texto cifrado 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 plano dado.

Por ejemplo, encriptemos 'hello world' usando un IV de un carácter de largo. El IV se selecciona aleatoriamente para ser 'x'. El texto que luego se cifra es 'xhello world', que muestra, por ejemplo, 'asdfghjkl'. Si lo encriptamos nuevamente, primero generemos un nuevo IV, digamos que esta vez obtenemos 'b', y encriptemos normalmente (encriptando así 'bhello world'). Esta vez tenemos 'qwertyuio'.

El punto es que el atacante no sabe cuál es el IV y, por lo tanto, debe calcular cada IV posible para un texto plano dado para encontrar el texto de cifrado correspondiente. De esta manera, el IV actúa como un contraseña de sal . Con mayor frecuencia, un IV se usa con un cifrado de encadenamiento (ya sea un flujo o un cifrado de bloque). En un cifrado de bloque de encadenamiento, el resultado de cada bloque de texto plano se alimenta al algoritmo de cifrado para encontrar el texto de cifrado para el siguiente bloque. De esta manera, cada bloque está encadenado.

Entonces, si tiene un IV aleatorio utilizado para cifrar el texto sin formato, ¿cómo lo descifra? Simple. Pase el IV (en texto plano) junto con su texto cifrado. Usando nuestro primer ejemplo anterior, el texto de cifrado final sería 'xasdfghjkl' (IV + texto de cifrado).

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

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

0
John