2

我很抱歉这个令人困惑的标题,老实说,我不知道该怎么称呼它!我在考虑这是否属于安全/加密交换网站之一,但由于这主要是一个编程问题,我将在此处发布。随意移动它!

我有一个 AES 加密流,并且当 AES 用块填充原始数据时,生成的加密数据几乎总是与原始未加密数据的大小不同。解密时,您需要知道要从加密流中读取多少字节(有多少未加密的字节)。我原本打算在数据包中发送原始的、未加密的数据长度,但后来我想到了另一种方法。如果我只是从 Crypto Stream 中读取 4096 个字节并存储读取了多少实际字节,那么我可以将正确数量的字节复制到一个新数组并使用它。

这样做安全吗?我的代码如下:

using (ICryptoTransform crypt = AES.CreateDecryptor())
{
    using (MemoryStream memStrm = new MemoryStream(data))
    {
        using (CryptoStream cryptStrm = new CryptoStream(memStrm, crypt, CryptoStreamMode.Read))
        {
            byte[] bytes = new byte[size];
            int read = cryptStrm.Read(bytes, 0, 4096);
            byte[] temp = new byte[read];
            Array.Copy(bytes, temp, read);
            return temp;
        }
    }
}

我的意思是安全的,它总是会产生正确的解密数据吗?

4

1 回答 1

2

你为什么要跳过这么多圈?MemoryStream、CryptoStream、临时数组...

return crypt.TransformFinalBlock(data, 0, data.Length);

为了使您的加密安全,您还应该为每次加密使用随机 IV,与密文一起存储。在 encrypt-then-mac 结构中添加 MAC(例如 HMAC-SHA-256)可以防止许多主动攻击,包括填充预言。

于 2013-02-14T08:12:56.513 回答