avevo bisogno di qualche semplice crittografia stringa, quindi ho scritto il seguente codice (con una grande quantità di "ispirazione" da here):Perché una password errata causa "Padding non valido e non può essere rimosso"?
// create and initialize a crypto algorithm
private static SymmetricAlgorithm getAlgorithm(string password) {
SymmetricAlgorithm algorithm = Rijndael.Create();
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(
password, new byte[] {
0x53,0x6f,0x64,0x69,0x75,0x6d,0x20, // salty goodness
0x43,0x68,0x6c,0x6f,0x72,0x69,0x64,0x65
}
);
algorithm.Padding = PaddingMode.ISO10126;
algorithm.Key = rdb.GetBytes(32);
algorithm.IV = rdb.GetBytes(16);
return algorithm;
}
/*
* encryptString
* provides simple encryption of a string, with a given password
*/
public static string encryptString(string clearText, string password) {
SymmetricAlgorithm algorithm = getAlgorithm(password);
byte[] clearBytes = System.Text.Encoding.Unicode.GetBytes(clearText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, algorithm.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(clearBytes, 0, clearBytes.Length);
cs.Close();
return Convert.ToBase64String(ms.ToArray());
}
/*
* decryptString
* provides simple decryption of a string, with a given password
*/
public static string decryptString(string cipherText, string password) {
SymmetricAlgorithm algorithm = getAlgorithm(password);
byte[] cipherBytes = Convert.FromBase64String(cipherText);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, algorithm.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(cipherBytes, 0, cipherBytes.Length);
cs.Close();
return System.Text.Encoding.Unicode.GetString(ms.ToArray());
}
Il codice sembra funzionare bene, tranne che quando decrittografia dei dati con un errato chiave, ottengo una CryptographicException - "Padding non è valido e non può essere rimosso" - sulla riga cs.Close() in decryptString.
codice di esempio:
string password1 = "password";
string password2 = "letmein";
string startClearText = "The quick brown fox jumps over the lazy dog";
string cipherText = encryptString(startClearText, password1);
string endClearText = decryptString(cipherText, password2); // exception thrown
viene, è questo che ci si aspetta mia domanda? Avrei pensato che decifrare con una password sbagliata avrebbe comportato un output senza senso, piuttosto che un'eccezione.
Questo mi ha risparmiato così tanto tempo con il tuo commento: "Il codice sembra funzionare bene, tranne che quando decrittando i dati con un tasto errato" "I _swore_ Avevo copiato i tasti, ma guardando 2x non l'ho fatto.Speriamo che questo aiuti qualcun altro prima di osservare il meccanismo di riempimento o di modificare il codice. – atconway