.NET AES 填充模式更改加密数据大小

.NET AES padding mode changes encrypted data size

我不一定有问题,我比较好奇。如果我将 AES 填充模式设置为 PKCS7,并加密长度为 128 的 byte[],则输出 byte[] 的长度为 144.

var input = new string('0', 128);
var inputBytes = Encoding.UTF8.GetBytes(input);

using var aes = Aes.Create();

Console.WriteLine(aes.BlockSize); // 128 (bits)

aes.Padding = PaddingMode.PKCS7;

using var encryptedMessageStream = new MemoryStream();
using (var cryptoStream = new CryptoStream(encryptedMessageStream, aes.CreateEncryptor(), CryptoStreamMode.Write, leaveOpen: true))
{
    cryptoStream.Write(inputBytes);
}

var encryptedBytes = encryptedMessageStream.ToArray(); // 144 length

如果我什么都不做,除了将填充模式切换为 None,那么加密字节的长度将是 128(与我的输入长度相同)。因此,即使我的输入数据没有改变,并且输入长度可以被 AES 块大小(8 字节)整除,填充模式也会改变最终输出。就我的理解而言,它不应该,因为我的输入长度可以被 AES 块大小整除。那么为什么 PKCS7None 会给出不同的输出大小?

当运行两种模式都通过解密时,我可以很好地取回原始消息。

PKCS padding 要求至少添加一个字节的padding:

The total number of padding bytes is at least one, and is the number that is required in order to bring the data length up to a multiple of the cipher algorithm block size.

因此,虽然您可能觉得 round-block-size 明文需要零字节,但这不是有效的填充量,因为最小数量是 1 字节。 (对此的解释是,否则解密者不可能区分恰好以 0x01 结尾的 round-block-size 明文和用单个 0x01 填充的短一个字节的明文。 )