我不一定有問題,我更好奇。如果我將 AES 填充模式設定為PKCS7,并加密byte[]長度為 128 的 a,則輸出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不同的輸出大小呢?
通過解密運行兩種模式時,我可以很好地恢復原始訊息。
uj5u.com熱心網友回復:
PKCS 填充要求至少添加一個位元組的填充:
填充位元組的總數至少為 1,并且是使資料長度達到密碼演算法塊大小的倍數所需的數量。
因此,雖然您可能會覺得您的圓形塊大小的明文需要零位元組,但這不是有效的填充量,因為最小數量是 1 個位元組。(對此的解釋是,否則解密器不可能區分恰好以 結尾的圓形塊大小的明文0x01和用單個 . 填充的短一個位元組的明文0x01。)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/455896.html
