.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 块大小整除。那么为什么 PKCS7
和 None
会给出不同的输出大小?
当运行两种模式都通过解密时,我可以很好地取回原始消息。
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
填充的短一个字节的明文。 )
我不一定有问题,我比较好奇。如果我将 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 块大小整除。那么为什么 PKCS7
和 None
会给出不同的输出大小?
当运行两种模式都通过解密时,我可以很好地取回原始消息。
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
填充的短一个字节的明文。 )