用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个额外字节的添加吗?
具有CBC或ECB等操作模式的AES仅适用于完整块(16字节的倍数),这就是需要填充的原因。当明文已经是块大小的倍数时,则必须添加一个额外的填充块,否则您将不知道在解密后要删除多少字节。
由于4096字节是块大小的倍数,因此添加了一个完整的填充块,然后所有内容都被加密,从而产生5012个密文字节。
这就是pkcs# 7填充的操作方式(有时被称为pkcs# 5填充)。如果您可以确定您将始终以块大小的倍数读取字节,则可以设置
myAes.Padding = PaddingMode.None;
用于加密和解密。
由于您使用随机生成的IV的CBC模式,您需要将其存储在某个地方。将IV写在密文的开头通常是个好主意,这样你就不必用其他方法跟踪它了。它不必是秘密的,只需要是不可预测的。