【发布时间】:2011-02-28 23:34:47
【问题描述】:
我正在尝试使用 AesManaged 加密流(来自文件)。我可以毫无错误地加密文件,但在解密时我得到以下 CryptographicException:
填充无效,不能 删除。
处理 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();
}
}
任何关于为什么会出现这个异常的想法都会很棒。谢谢
更新
这里是创建 Aes 对象的地方,注意 Key 和 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 - 我在实例化该对象的地方添加了 sn-p。
-
这个错误可能是由很多原因引起的。很可能是您使用了错误的密钥或 IV。它也可能是由数据损坏引起的。
-
@GregS - 我将其更改为使用上面显示的固定键和 IV,所以它们应该是相同的。我正在获取文件并将其上传到 AmazonS3,并且我已经尝试了几次,所以我不知道数据会如何损坏,除非我做错了什么。
标签: c# encryption aes