用aes加密后,我的文件长了一个块

本文关键字:一个 加密 aes 文件 我的 | 更新日期: 2023-09-27 18:08:23

我使用AES加密模式CBC和默认填充(我没有设置它,所以我猜它会设置默认填充模式)。

当我尝试,作为一个例子/test,加密一个只写了几个字的。txt文件(假设它是50字节);输出文件高一个块,例如4096+16=5012。我猜这是因为它读取一个4096字节的完整块,对它进行编码,然后写入它。然后他又增加了16个字节,不知道为什么;因为填充是用来填充块的

我的代码是:
using (Aes myAes = Aes.Create())
{
     myAes.BlockSize = myAes.LegalBlockSizes[0].MaxSize;
     myAes.KeySize = myAes.LegalKeySizes[0].MaxSize;
     myAes.Mode = CipherMode.CBC;
     myAes.GenerateIV();
     myAes.GenerateKey();
     ICryptoTransform encryptor = myAes.CreateEncryptor(myAes.Key, myAes.IV );
     CryptoStream csCrypt = new CryptoStream(FileOUT, encryptor, CryptoStreamMode.Write);
     do
     {
          bytesRead = FileIN.Read(buffer, 0, bufferLen);
          if (bytesRead != 0)
          {
               csCrypt.Write(buffer, 0, bufferLen);
          }
     } while (bytesRead != 0);
     csCrypt.Close();
     csCrypt.Dispose();
     FileIN.Close();
     FileIN.Dispose();
     FileOUT.Close();
     FileOUT.Dispose();
}

对吗?有什么办法可以修复这16个额外字节的添加吗?

用aes加密后,我的文件长了一个块

具有CBC或ECB等操作模式的AES仅适用于完整块(16字节的倍数),这就是需要填充的原因。当明文已经是块大小的倍数时,则必须添加一个额外的填充块,否则您将不知道在解密后要删除多少字节。

由于4096字节是块大小的倍数,因此添加了一个完整的填充块,然后所有内容都被加密,从而产生5012个密文字节。

这就是pkcs# 7填充的操作方式(有时被称为pkcs# 5填充)。如果您可以确定您将始终以块大小的倍数读取字节,则可以设置

myAes.Padding = PaddingMode.None;

用于加密和解密。

由于您使用随机生成的IV的CBC模式,您需要将其存储在某个地方。将IV写在密文的开头通常是个好主意,这样你就不必用其他方法跟踪它了。它不必是秘密的,只需要是不可预测的。