我收到错误"填充无效,无法移除。" 尝试以块的形式解密文件内容时(使用缓冲区)。我能够一次解密整个文件,但不能在块中解密。我找到了很多关于这个问题的链接,他们中的大多数建议设置Padding of AesManaged对象 比如 aesManaged.Padding = PaddingMode.None 但是这个属性在窗口电话应用程序中不可用。 以下是方法:
internal static byte[] DecryptBytes(byte[] cipherText, string password)
{
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
byte[] decryptedBytes= new byte[cipherText.Length];
using (var rijAlg = new AesManaged { KeySize = 256, BlockSize = 128 })
{
var key = new Rfc2898DeriveBytes(password, Encoding.UTF8.GetBytes(Salt));
rijAlg.Key = key.GetBytes(rijAlg.KeySize / 8);
rijAlg.IV = key.GetBytes(rijAlg.BlockSize / 8);
// Create a decrytor to perform the stream transform.
ICryptoTransform decryptor = rijAlg.CreateDecryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for decryption.
using (var msDecrypt = new MemoryStream())
{
using (var csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Write))
{
csDecrypt.Write(cipherText, 0, cipherText.Length);
csDecrypt.FlushFinalBlock();
}
decryptedBytes = msDecrypt.ToArray();
}
}
return decryptedBytes;
}
请在上述代码或任何其他解决方法中建议问题
答案 0 :(得分:1)
不要使用aesManaged.Padding = PaddingMode.None
它只会隐藏错误,而不会解决错误。你会得到错误导出的密钥,不正确的密文或 - 对于较小的密文 - 错误的IV。
在执行解密之前,以十六进制格式打印所有输入的值,然后将它们与为加密获得的值进行比较。