【发布时间】:2017-06-20 00:50:24
【问题描述】:
我实现了以下方法:
public static byte[] AESDecrypt(byte[] data, ICryptoTransform transform)
{
using (MemoryStream stream = new MemoryStream(data))
using (CryptoStream cstream = new CryptoStream(stream, transform, CryptoStreamMode.Read))
using (MemoryStream output = new MemoryStream())
{
byte[] buffer = new byte[4000];
int r;
while ((r = cstream.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, r);
}
stream.Close();
return output.ToArray();
}
}
我是用这个方法解密一个16字节的序列块,transform参数一开始就初始化一次:
AesCryptoServiceProvider provider = new AesCryptoServiceProvider();
provider.Mode = CipherMode.ECB;
provider.KeySize = 128;
provider.BlockSize = 128;
provider.Key = key;
provider.Padding = PaddingMode.PKCS7;
transform = provider.CreateDecryptor();
我的问题是该方法突然开始产生奇怪的输出,16 字节块被解密为 27 字节!!!,有时 16 字节被错误地解密为 16 字节,但是当我重新启动应用程序时,相同的数据产生正确结果,转换是否保持任何使这种情况发生的状态?我做错了什么导致 16 字节块解密为 27 字节。
感谢任何帮助
`编辑:
谁能确认这是同一个错误: Reuse ICryptoTransform objects
编辑 2:
对正确答案的补充:
ICryptoTransform 似乎不是线程安全的,所以从两个线程同时调用上述方法可能会造成麻烦,我通过为每个使用该方法的线程创建 ICrypteTransform 对象来解决它
【问题讨论】:
-
不,是一样的,但是我发现了这个stackoverflow.com/questions/43593495/…
-
反正我告诉你16个字节被解密成27个字节,这和我的日期有什么关系??????你的评论不合适
标签: c# encryption cryptography aes