Estoy escribiendo una aplicación de copia de seguridad que debería tener la función de cifrar la copia de seguridad. Debe cifrar datos de archivos, rutas y nombres de archivos. La aplicación se está escribiendo en C # (.NET). Target es sistemas Windows, pero potencialmente también otras plataformas bajo Mono.
Parece que AES debería usarse con una instancia de la clase RijndaelManaged. Las funciones de cifrado y descifrado pueden recibir un IV, una clave secreta y, por supuesto, los datos.
El usuario ingresará una contraseña o frase de contraseña de cualquier longitud. Se les aconsejará elegir algo razonable, como entre 8 y 50 caracteres. La contraseña será almacenada en alguna forma de hash. No estoy seguro todavía si esto será scrypt o bcrypt o algo así. Aunque la copia de seguridad se puede descifrar con esto, al menos no se sabrá la contraseña original.
- Cualquier expansión necesaria para obtener una clave con la que AES puede trabajar es realizada por AES, ¿verdad? ¿O necesito expandir la entrada (con alguna función segura) a una longitud de clave que AES acepta?
- Tanto el IV como la clave deben ser iguales durante el cifrado y el descifrado para descifrar los datos con éxito. La clave es siempre la misma. ¿Qué debería ser la IV? Supongo que el IV podría ser un número incremental, lo que haría que el cifrado aún pareciera aleatorio incluso cuando los datos y la clave son idénticos, de modo que se filtre la menor cantidad de información posible. ¿Es correcto este supuesto? ¿Eso significa que un buen IV sería el ID de archivo (todos obtienen un número único, o al menos eso podría generarse)?
- Se guarda un metarchivo que mapea las ID de ruta y archivo a la ruta y nombre de archivo originales. Por ejemplo, la ruta 1, el archivo 3 podría expandirse a C: \ Windows \ explorer.exe. Este metarchivo probablemente será texto simple, solo los valores (ruta y nombres de archivo) serán encriptados. ¿Cuál debería ser la IV para los valores? ¿Su identificación numérica? ¿O un valor aleatorio que se almacena en algún lugar en texto sin formato? ¿O puedo usar un IV fijo (codificado)?
- ¿Hay algo que deba saber al ejecutar (o intentar ejecutar) la aplicación en Mono? ¿Puedo confiar en alguna fuente de pseudoaleatoriedad para tener suficiente entropía?
- ¿AES proporciona integridad de forma predeterminada, o debo almacenar un MAC (o algo así) de cada parte de datos cifrados (metadatos y datos de archivos)?
Si conoce la respuesta a cualquiera de estas preguntas, ¡cualquier ayuda es muy apreciada!