Entonces, esta es probablemente una pregunta estúpida, pero estoy tratando de entender por qué no se hace lo siguiente para los archivos de descanso cifrados mediante contraseña:
- generar una clave AES-256 / salt / iv
- tome el mensaje de texto sin formato (digamos un archivo de 50 MB) y cifrelo con las credenciales del paso 1
- adjuntar credenciales al mensaje cifrado
- permita que el usuario elija una contraseña y la convierta en una clave AES-256 usando algún método estándar
- cifre los resultados del paso 3 usando la clave del paso 4, usando AES como un cifrado de flujo síncrono con una forma modificada de modo de realimentación de salida donde:
- en lugar de usar el texto simple para alimentar el siguiente bloque, se aplica una función de hashing de alta memoria (como Argon2i) al texto simple, y los resultados de esa operación se incorporan al siguiente bloque
- dicha función de hashing usaría parámetros de costos consistentes derivados del tamaño de los datos en 3. (y, por lo tanto, la cantidad de bloques necesarios), más la cantidad deseada de memoria necesaria para descifrar el archivo completo (para que su programa de cifrado lo conozca) desea que se requiera escribir un total de 1 GB de memoria para descifrar este archivo)
A menos que el propio AES-256 estuviera comprometido, parecería que para atacar este archivo, tendría que:
- elija una contraseña probable y conviértala a la clave AES-256 correspondiente
- use esta clave para descifrar el archivo completo, en cada bloque que calcula el hash Argon2i del bloque anterior (que requiere una cantidad predeterminada de memoria)
- cuando llegues al final del archivo, usa los bits al final (que podría ser la clave que necesitas) para descifrar el primer bloque (ya descifrado una vez) y ver si estás correcto
Ya que no se pudo paralizar fácilmente el agrietamiento debido al cifrado de flujo síncrono (cada intento requiere descifrado de mensaje completo), más el hecho de que cada bloque requiere que escriba una cantidad arbitraria de memoria (lo que reduce la amenaza de GPU rápidas / futuras computadoras cuánticas / etc), un método como este no proporcionaría seguridad adicional de manera que el cambio de AES-256 a un AES-512 teórico no (ya que cada contraseña relativamente corta generará una clave AES-512 completa, y puedes verificar si esa suposición es correcta sin descifrar todo el mensaje, por lo que realmente no se gana nada).
Al ajustar los parámetros a su función de hashing (según el tamaño del archivo), debería poder decir "intentar descifrar este archivo de 1 KB requerirá escribir 500 MB de memoria ... e intentar descifrar este archivo de 3 GB También requerirá escribir 500MB de memoria ". Por lo tanto, no sería necesariamente lento para los archivos grandes.
Sé que tiene que haber una razón para que esto no se haga, ¡y me encantaría descubrir en qué me voy mal!