我想使用AesManaged加密流(来自文件)。我可以在没有错误的情况下对文件进行加密,但解密时出现以下加密错误:解密流时填充无效
填充无效,不能删除 。
当处置CryptoStream时会引发异常。我用下面的加密输入数据:
public byte[] Encrypt(Stream plain)
{
// Create a decrytor to perform the stream transform.
using(var msEncrypt = new MemoryStream())
{
using (ICryptoTransform encryptor = _myAes.CreateEncryptor(_myAes.Key, _myAes.IV))
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (BinaryWriter swEncrypt = new BinaryWriter(csEncrypt))
{
int buf_size = 32768;
byte[] buffer = new byte[buf_size];
int read = 0;
while ((read = plain.Read(buffer, 0, buf_size)) > 0)
{
swEncrypt.Write(buffer, 0, read);
}
}
return msEncrypt.ToArray();
}
}
这对数据进行解密:
public byte[] Decrypt(Stream cipherText)
{
using (MemoryStream ms = new MemoryStream())
{
// Create a decrytor to perform the stream transform.
using (ICryptoTransform decryptor = _myAes.CreateDecryptor(_myAes.Key, _myAes.IV))
using (CryptoStream csDecrypt = new CryptoStream(ms, decryptor, CryptoStreamMode.Write))
using (BinaryWriter swDecrypt = new BinaryWriter(csDecrypt))
{
int buf_size = 32768;
byte[] buffer = new byte[buf_size];
int read = 0;
while ((read = cipherText.Read(buffer, 0, buf_size)) > 0)
{
swDecrypt.Write(buffer, 0, read);
}
}
return ms.ToArray();
}
}
为什么这个异常上来将是巨大的任何想法。由于
UPDATE
这里是AES创建对象,其中,需要注意的重点和IV正好被设置为它们的当前值是暂时的,它不是将要使用的真正的关键:
private Crypto()
{
_myAes = new AesManaged();
_myAes.Padding = PaddingMode.PKCS7;
_myAes.KeySize = 128;
_myAes.Key = Enumerable.Repeat((byte)'B', 128/8).ToArray();
_myAes.IV = Enumerable.Repeat((byte)'C', 128/8).ToArray();
}
你能告诉你如何创建_myAes? – SimonJ 2011-02-28 23:47:26
@SimonJ - 我在实例化对象的地方添加了片段。 – 2011-03-01 00:00:45
这个错误可能是由很多事情造成的。最有可能的是你使用了错误的钥匙或IV。它也可能是由数据损坏引起的。 – 2011-03-01 00:43:46