Sto scrivendo un'applicazione di backup che dovrebbe avere la caratteristica di crittografare il back-up. Deve crittografare i dati dei file, i percorsi e i nomi dei file. L'applicazione viene scritta in C # (.NET). L'obiettivo sono i sistemi Windows, ma potenzialmente anche altre piattaforme sotto Mono.
Sembra che AES dovrebbe essere usato con un'istanza della classe RijndaelManaged. Le funzioni di crittografia e decrittografia possono essere fornite con un IV, una chiave segreta e, naturalmente, i dati.
L'utente immetterà una password o una passphrase di qualsiasi lunghezza. Saranno avvisati di scegliere qualcosa di ragionevole, come tra 8 e 50 caratteri. La password verrà memorizzata sotto forma di hash. Non sono ancora sicuro se questo sarà scrypt o bcrypt o qualcosa del genere. Anche se il back-up può essere decodificato con questo, almeno la password originale non sarà conosciuta.
- Qualsiasi espansione necessaria per ottenere una chiave con cui AES può lavorare è fatta da AES stesso, giusto? O devo espandere l'input (con qualche funzione sicura?) Ad una lunghezza della chiave che AES accetta da solo?
- Sia la versione IV che la chiave devono essere uguali durante la crittografia e la decrittografia per decrittografare i dati con successo. La chiave è sempre la stessa. Cosa dovrebbe essere l'IV?
Immagino che l'IV potrebbe essere un numero progressivo, il che farebbe sembrare la crittografia casuale anche quando i dati e la chiave sono identici, in modo che trapelino meno informazioni possibili. Questa affermazione è giusta? Ciò significa che una buona IV sarebbe l'ID del file (tutti otterranno un numero univoco, o almeno che potrebbe essere generato)? - Viene mantenuto un metafile che associa il percorso e gli ID del file al percorso e al nome file originali. Ad esempio il percorso 1, il file 3 potrebbe espandersi in C: \ Windows \ explorer.exe. Questo metafile sarà probabilmente in chiaro, solo i valori (percorso e nomi di file) verranno crittografati. Quale dovrebbe essere l'IV per i valori? Il loro id numerico? O un valore casuale che viene memorizzato da qualche parte in testo normale? Oppure posso usare un IV fisso (con hard-coding)?
- C'è qualcosa che dovrei sapere quando si esegue (o si tenta di eseguire) l'applicazione in Mono? Posso contare su qualsiasi fonte di pseudo-casualità per avere abbastanza entropia?
- AES fornisce l'integrità per impostazione predefinita o devo memorizzare un MAC (o qualcosa) di ogni pezzo di dati crittografato (metadati e dati di file)?
Se conosci la risposta a una di queste domande, qualsiasi aiuto è molto apprezzato!