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?