Para el cifrado basado en contraseña, debe:
- transforme la contraseña en una clave adecuada para el algoritmo de cifrado (un proceso llamado derivación de clave );
- use esa clave para cifrar el archivo.
Suponiendo que todo lo relacionado con la fase de cifrado se realizó correctamente y que el algoritmo utilizado no es débil, entonces la ruta de ataque más directa es la contraseña: el atacante intentará las posibles contraseñas, aplicará la derivación de clave y luego la desencriptará, para ver si el resultado "tiene sentido". El punto importante aquí es que el atacante no necesita descifrar todo el archivo para ver si parece el texto claro esperado o no; por ejemplo, si el atacante deduce que el archivo es una imagen JPEG, entonces solo necesita descifrar los primeros cuatro bytes para ver si estos producen la secuencia de inicio esperada para tal archivo (FF D8 FF E0). Incluso si el usuario honesto desea el archivo completo y, por lo tanto, tendrá que descifrarlo por completo (lo que implica que I / O lea el archivo y lo escriba), el atacante no está obligado a hacer lo mismo durante su ataque. p>
Por lo tanto, NO DEBES suponer que la velocidad de descifrado del archivo completo hace que el ataque sea más lento o más rápido. En ese sentido, proporcionar una prueba "rápida" para la corrección de la contraseña tampoco facilitará las cosas al atacante.
However...
Debes tener cuidado de hacer las cosas correctamente. En primer lugar, la forma más fácil de diseñar un formato seguro para el cifrado de archivos basado en contraseña es utilizar un formato existente para el cifrado de archivos basado en contraseña, que ya ha sido diseñado, analizado, implementado y probado. Un candidato razonable es entonces OpenPGP , y (en particular) su implementación de código abierto GnuPG .
Si aún insiste en hacer su propio diseño y luego su implementación, debe comprender que el núcleo de su seguridad residirá en el proceso de derivación de claves, también denominado hashing de contraseña . Hay mucha teoría y práctica sobre el tema, así que sugiero que empiece por leer esta respuesta .
Ahora, si tiene el hashing correcto de su contraseña, con todas las iteraciones y las sales aleatorias, podría imaginar un proceso en el que la contraseña se derive en una clave K de, digamos, 256 bits (32 bytes). Luego divida esa clave en dos mitades K 1 y K 2 (128 bits cada una). Agregue una copia de K 1 en el encabezado del archivo cifrado, para comprobar la corrección de la contraseña; y use K 2 (no K 1 !) para cifrar realmente el archivo. Esto es seguro siempre y cuando la función de derivación de clave basada en contraseña sea segura como una función de derivación de clave.
Por supuesto, si necesita cifrado, entonces (probablemente) hay atacantes y, en general, se sabe que los atacantes son malos. Ellos no juegan por las reglas. En particular, si pueden ver archivos cifrados, entonces es probable que puedan modificar archivos cifrados. Para detectar de manera confiable dichas modificaciones, necesitará un MAC , y luego las cosas se convierte en complejo . El potencial de error de diseño catastrófico es alto.