【问题标题】:AES encryption in C# strange outputC# 奇怪输出中的 AES 加密
【发布时间】: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


【解决方案1】:

当您打算关闭 cstream 时,您正在关闭 stream

由于您在读出数据之前没有关闭cstream,因此永远不会调用TransformFinalBlock

您最好使用Stream.CopyTo,并使您的输出流比 CryptoStream 具有更清晰的更长寿命。

public static byte[] AESDecrypt(byte[] data, ICryptoTransform transform)
{
    using (MemoryStream output = new MemoryStream())
    {
        using (MemoryStream stream = new MemoryStream(data))
        using (CryptoStream cstream = new CryptoStream(stream, transform, CryptoStreamMode.Read))
        {
            cstream.CopyTo(output);
        }

        return output.ToArray();
    }
}

【讨论】:

  • 感谢您提供信息,但众所周知,解密不涉及调用 TransferFinalBlock,因为所有输入总是除以 16(这是填充的好处)。无论如何谢谢你的注意
  • @ammcom TransformFinalBlock 负责删除任何填充,以及重置 ICryptoTransform。确保它被调用是非常重要的,否则你的输出会变得非常刺耳。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
  • 1970-01-01
  • 2020-04-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 2011-06-14
相关资源
最近更新 更多