¿Es seguro usar una parte de la clave como IV en AES?

3

He visto muchos ejemplos de implementación de AES en Internet en casi todos los idiomas que puedo reconocer. Hay una diferencia que creo que debe repetirse entre todos.

Algunos de ellos requieren un IV y una clave. Dos entidades Algunos de ellos reutilizan una parte de la clave de 128 bits como IV. Una entidad (en mis ojos).

Por ejemplo, esto se puede encontrar en la red

Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, salt);  
rijndael.Key = pdb.GetBytes(32);  
rijndael.IV = pdb.GetBytes(16); 

..y toda la muestra de la que proviene esta parte está bastante extendida. Incluso en los foros de MSDN. Otro éxito en la red con 22 votos a favor dice " Este es el código plug and play que encontré en internet. Simplemente funciona: "

Esto me causa un dolor de cabeza. ¿Es esto seguro? No puedo ver por qué los autores se molestan en crear una funcionalidad IV solo para ver que se trata de un atajo con solo cortar la clave a la mitad para producir una matriz de bytes con un tamaño que se ajuste a IV?

Siento que la pregunta será más compleja porque si los diferentes modos de cifrado usan el IV de manera diferente. También puede depender de cómo se construye la aplicación. Por ejemplo; ¿Es la clave completa siempre única? Si no, ¿cómo es la entropía de la llave? Y por separado, ¿es el par (iv, contraseña) siempre único?

Al observar muchas de las muestras que llenan IV con una parte de la clave, publicaron una matriz estática de 16 bytes con valores fijos. No hay ninguna indicación ni intento de hacer que la audiencia entienda que se espera que la muestra se utilice para las claves aleatorias -lo que sea-.

¿Es seguro usar una parte de la clave como IV y cuáles son las mejores prácticas?

    
pregunta Independent 25.05.2016 - 09:20
fuente

2 respuestas

5
  

¿Es seguro usar una parte de la clave como IV y cuáles son las mejores prácticas?

En una palabra. NO.

IV es una parte fundamental de la criptografía que forma parte del elemento esencial de la asignación al azar. El uso de un IV no criptográfico aleatorio que es estático o predecible como parte de su proceso de encriptación significa que usted está potencialmente debilitando el elemento de aleatorización de su algoritmo criptográfico elegido.

El código de ejemplo de razón con frecuencia utiliza IVs fijos es por esa misma razón. Es un código de ejemplo, comúnmente encontrado en libros o en sitios web. Los autores tienen la necesidad y el deseo de mantener el código de ejemplo lo más corto posible, por lo que las IV fijas se utilizan en la comprensión no escrita de que el lector tiene una base suficiente en los principios de la criptografía para saber que deben usar IV aleatorias en la vida real.

Si la memoria no falla, Bruce Schneier tiene un capítulo completo sobre las IV en uno (o más) de sus libros. Ese sería un excelente punto de partida si realmente quiere entrar en los detalles del asunto.

    
respondido por el Little Code 25.05.2016 - 09:48
fuente
4

La respuesta de Little Code es correcta, ya que es absolutamente no segura para reutilizar parte de la clave como un IV, especialmente si pretende usar la clave para cifrar más de una sola pieza de datos.

SIN EMBARGO : no es lo que está haciendo el fragmento de código al que hace referencia en su pregunta.

Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(password, salt);  
rijndael.Key = pdb.GetBytes(32);  
rijndael.IV = pdb.GetBytes(16);

La forma en que Rfc2898DeriveBytes.GetBytes () funciona, las llamadas sucesivas devuelven bytes adicionales, no los mismos bytes. Entonces, llamar a GetBytes(32); y luego GetBytes(16) es funcionalmente equivalente a llamar a GetBytes(48); y luego dividir los resultados en matrices de longitudes 32 y 16.

Esta es una construcción segura si, y solo si la sal es globalmente única. (En la práctica, esto generalmente significa aleatorio y de una longitud adecuada). La razón por la que obtendría tanto la Clave como la IV de esta manera es porque, o bien necesita: a) almacenar la IV para descifrar o b) saber cómo volver a generarla Para el descifrado. Dado que ya necesitamos almacenar la sal que usamos como entrada para Rfc2898DeriveBytes , es más fácil y tiene más sentido usarla para generar tanto la clave como la IV y luego tener que almacenar una IV también. Nuevamente, mientras la sal sea única, terminaremos con un IV seguro que será único para esta combinación de contraseña / sal.

    
respondido por el Xander 25.05.2016 - 16:00
fuente

Lea otras preguntas en las etiquetas