Questa domanda è stata anche posta su StackOverflow, ma senza risposte, e ho pensato che questo potesse essere uno scambio migliore, dal momento che ho la stessa domanda.
Usando AESCryptoServiceProvider, ho notato che prima di implementare qualsiasi logica per passare l'IV dalla parte di crittografia alla parte decrittante, il mio file zip di grandi dimensioni è stato decrittografato correttamente (per quanto ne so). Così ho scritto un piccolo test per capire perché questo ha funzionato, come non me l'aspettavo.
Utilizzo delle funzioni di crittografia ... e decrittografia ... trovate su: link
E il seguente test:
static void TestIV()
{
string plainText = "abcdefghijklmnopqrstuvwxyz0123456789asdfqwerfdsareqw";
byte[] key;
string roundTrip = "";
byte[] encrypted = null;
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
key = aes.Key;
Console.WriteLine("encryption Key = " + System.Convert.ToBase64String(aes.Key));
Console.WriteLine("encryption IV = " + System.Convert.ToBase64String(aes.IV));
encrypted = EncryptStringToBytes_Aes(plainText, aes.Key, aes.IV);
Console.WriteLine("cipherText = " + System.Convert.ToBase64String(encrypted));
}
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.Key = key;
Console.WriteLine("decryption Key = " + System.Convert.ToBase64String(aes.Key));
Console.WriteLine("decryption IV = " + System.Convert.ToBase64String(aes.IV));
roundTrip = DecryptStringFromBytes_Aes(encrypted, aes.Key, aes.IV);
}
Console.WriteLine("Original: " + plainText);
Console.WriteLine("Round Trip: " + roundTrip);
}
Questo è stato il mio risultato:
encryption Key = 0Fnvwk0qzbn6sQ+qUbGDyz0MmpBt5e3vkA+7YCUYTzc=
encryption IV = 7E5iw+226INZNzA6y7wWjQ==
cipherText = YVj3ZsSx9nbOKor6ZGqzyGFxdnaR6KM+qSeQj322+2QyhU9Iu1G3d4xPnj7n0X/wpObvjpFBlHf+9rRFWtPodA==
decryption Key = 0Fnvwk0qzbn6sQ+qUbGDyz0MmpBt5e3vkA+7YCUYTzc=
decryption IV = o//BGrMnXatF5po9dUEnug==
Original: abcdefghijklmnopqrstuvwxyz0123456789asdfqwerfdsareqw
Round Trip: .???;??@u??k?^Gqrstuvwxyz0123456789asdfqwerfdsareqw
Risulta che probabilmente il primo blocco del mio file zip è stato storpiato, ma è stato decompresso con successo e i file che ho visto non devono far parte del primo blocco.
Eseguendo questo più volte ottengo i seguenti cipherTexts:
cipherText = ZsvLpvVucn0ekx393Fmk5R/UrzzPmzH4dY32EqVlpHJvAKGRERIUY7LLPGHIuyPikHcGKUWL/mt8eP6RI/Qqcw==
cipherText = 0i5tZ1vQvmU5zMimCBIqCWsQzze8PDEOuOxVYekq8T/IGKu4VuHuZWJ6H4aPjRqmSBQYRDbWff6o3Odjl8Qg8A==
cipherText = En/I32AeAASiq10j7ChNPzclWdj8uc6hdBUk/sp8S9G7ly6QBCPAzJFJCR1c9TWjb1gUbzrCEghUgCoRnlJbGA==
Quindi sembra che l'IV stia creando con successo un cipherText diverso per lo stesso testo del previsto. Quindi, quando decifri con una IV errata, è previsto che solo il primo blocco verrà alterato?
Si noti che AesCryptoServiceProvider utilizza la modalità CBC per impostazione predefinita, ma ho visto questo stesso comportamento utilizzando CFB e, quando si utilizza ECB, il testo in chiaro era completamente lo stesso (primo blocco non alterato).