我有一个存储加密文本数据的程序。每当添加新数据时,都会从文件中加载加密数据,然后解密,附加新的字符串数据,最后将数据重新加密并保存到磁盘。直到最近一直可以使用,但是现在解密加载的数据时得到CryptographicException: Padding is invalid and cannot be removed
。这是我用来加密/解密数据的代码:
public static byte[] Encrypt(string text, byte[] key) {
byte[] encrypted;
byte[] IV;
using (var aes = Aes.Create()) {
aes.Key = key;
aes.GenerateIV();
IV = aes.IV;
aes.Mode = CipherMode.CBC;
var encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
using (var msEncrypt = new MemoryStream())
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
using (var swEncrypt = new StreamWriter(csEncrypt)) {
swEncrypt.Write(text);
}
encrypted = msEncrypt.ToArray();
}
}
// return plaintext IV and encrypted text payload concatenated
return IV.Concat(encrypted).ToArray();
} // Encrypt()
public static string Decrypt(byte[] bytes, byte[] key) {
string plaintext = null;
using (var aes = Aes.Create()) {
aes.Key = key;
// split iv and encryped cyphertext
byte[] IV = new byte[aes.BlockSize / 8];
byte[] cipherText = new byte[bytes.Length - IV.Length];
Array.Copy(bytes, IV, IV.Length);
Array.Copy(bytes, IV.Length, cipherText, 0, cipherText.Length);
aes.IV = IV;
aes.Mode = CipherMode.CBC;
var decryptor = aes.CreateDecryptor(aes.Key, aes.IV);
using (var msDecrypt = new MemoryStream(cipherText))
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
using (var srDecrypt = new StreamReader(csDecrypt)) {
plaintext = srDecrypt.ReadToEnd();
// !!! EXCEPTION HAPPENS HERE !!!
}
}
return plaintext;
}
使用普通的byte[]
/ File.ReadAllBytes
读写加密的File.WriteAllBytes
数组。
我试图将代码更改为逐字节读取,直到发生异常为止,这使我得到的解密文本减去16个字节。但是,只有前三分之一包含有效文本,其余部分是几个乱码字节,然后是一个(同样乱码)16字节序列,一遍又一遍地重复。这使我怀疑在先前的保存操作期间发生了某种损坏。
任何有关恢复数据(如果可能)并指出加密/解密代码(如果有)中的问题/错误的帮助,将不胜感激。