Necesitaba un poco de cifrado de cadena sencilla, por lo que escribió el siguiente código (con una gran cantidad de "inspiración" de here):¿Por qué causa una contraseña incorrecta "El relleno no es válido y no se puede eliminar"?
// 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());
}
El código parece funcionar bien, excepto que cuando el descifrado de datos con una incorrecta clave, obtengo una CryptographicException - "El relleno no es válido y no se puede eliminar" - en la línea cs.Close() en decryptString.
código de ejemplo:
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
está, se espera que esto sea mi pregunta? Hubiera pensado que descifrar con la contraseña incorrecta solo daría como resultado una salida sin sentido, en lugar de una excepción.
Esto me ahorró mucho tiempo con su comentario: '" Parece que el código funciona bien, excepto que al descifrar datos con una clave incorrecta "' _jusque_ había copiado las claves, pero mirando 2x no lo hice.Esperemos que esto ayude a otra persona antes de mirar el mecanismo de relleno o cambiar el código. – atconway