Se si prende un file crittografato con CBC e si altera un bit (cioè si cambia un bit zero in uno, o viceversa), quindi, dopo la decrittazione, questo sarà:
- mescolare più o meno a caso il blocco corrispondente nei dati di testo in chiaro;
- capta esattamente un bit nel blocco successivo (ovvero 128 bit più avanti);
- cambia nient'altro di tutti . In particolare, la decrittografia non "fallirà".
Vedi lo schema sulla pagina Wikipedia per CBC per capire perché questo funziona modo.
Quello che stai vedendo è che quando usi la crittografia (per riservatezza), di solito vuoi anche avere l'integrità controllata, con un MAC algoritmo come HMAC. Accade quindi che combinando correttamente la crittografia e un MAC sia difficile . La soluzione migliore sarebbe utilizzare un formato di crittografia che funzioni già correttamente. Se è necessario, per qualche motivo, eseguire la propria crittografia, quindi provare a utilizzare una modalità di crittografia che include intrinsecamente un MAC, ad es. GCM o EAX . Se per ragioni tecniche (ad esempio, mancanza di implementazione disponibile) devi comunque utilizzare CBC, quindi aggiungere un HMAC con le seguenti regole:
- Hash la tua chiave principale K (quella che "memorizzi in modo sicuro") con SHA-256. Suddividi il risultato a 256 bit in due metà a 128 bit, K 1 e K 2 .
- Utilizza AES-128 in modalità CBC, con K 1 come chiave, per crittografare i dati. Assicurati di utilizzare un IV casuale, generato di nuovo per ogni file, con un PRNG crittograficamente sicuro.
- Calcola HMAC / SHA-256, con K 2 come chiave, sopra la concatenazione di IV e il file crittografato .
- Archivia il file in un formato che includerà l'IV, l'output HMAC e il risultato della crittografia. La semplice concatenazione funzionerebbe, dal momento che l'output IV e HMAC hanno note lunghezze fisse (16 byte per IV, 32 byte per HMAC / SHA-256).
- Quando decifri, verifica il valore HMAC prima e procedi con la decrittografia dei dati solo se il valore HMAC sembra essere corretto.
Potresti notare che sostengo AES-128, non AES-256. Questo perché una chiave di crittografia a 256 bit è inutile overkill e incorre in una penalità di velocità del 40%. Se desideri ancora una chiave di crittografia a 256 bit, ad es. perché devi corteggiare un gestore senza clu con quanto è grande la tua chiave, quindi usa SHA-512 per eseguire l'hash della tua chiave principale K in un'uscita a 512 bit, che può essere divisa in due metà a 256 bit .
Raccomando anche HMAC / SHA-256, che dovrebbe essere "abbastanza veloce". Un PC di base può utilizzare AES-128 e HMAC / SHA-256 combinati a più di 60 megabyte al secondo. Se hai bisogno di più velocità e hai una piattaforma a 64 bit, allora HMAC / SHA-512 può darti un vantaggio, ma a spese di renderlo più difficile per i sistemi a 32 bit. In ogni caso, la rete da 100 Mbit / s raggiungerà circa 11 megabyte al secondo, quindi la velocità di crittografia probabilmente non sarà comunque un problema.