加密 AES 256 输入明文长度问题
Encryption AES 256 Input Plaintext Length Issue
我的安全团队希望我使用 AES256 密钥强度和 CBC 模式。在更改为 256 CBC 并将块大小更改为 128 后,我现在输入长度为 32 个字母的输入明文时,我的代码才有效。
如果我输入 "This is a test"(不是 32 个字符长),我会收到:
System.Security.Cryptography.CryptographicException: The input data is
not a complete block.
如果我输入:“ABCDEFGHIJKLMNOPQRSTUVWXYZ000000”,有效!
我需要什么代码才能使用 "This is a test" 作为输入。
代码如下:
public byte[] EncryptStringToByte(string plainText, byte[] key, byte[] vector)
{
byte[] encrypted;
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.BlockSize = 128;
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.None;
aes.Key = key;
aes.IV = vector;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
// Return the encrypted bytes from the memory stream.
return encrypted;
}
AES 是一种分组密码,因此它仅适用于恰好有一个分组大小的明文。像 CBC 这样的操作模式使您能够加密块大小的倍数的明文。要加密任意长度的明文,必须使用填充模式。
用于块密码的常见模式是 PKCS#5/PKCS#7:
aes.Padding = PaddingMode.PKCS7;
我的安全团队希望我使用 AES256 密钥强度和 CBC 模式。在更改为 256 CBC 并将块大小更改为 128 后,我现在输入长度为 32 个字母的输入明文时,我的代码才有效。
如果我输入 "This is a test"(不是 32 个字符长),我会收到:
System.Security.Cryptography.CryptographicException: The input data is not a complete block.
如果我输入:“ABCDEFGHIJKLMNOPQRSTUVWXYZ000000”,有效!
我需要什么代码才能使用 "This is a test" 作为输入。
代码如下:
public byte[] EncryptStringToByte(string plainText, byte[] key, byte[] vector)
{
byte[] encrypted;
using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
{
aes.BlockSize = 128;
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.None;
aes.Key = key;
aes.IV = vector;
// Create a decrytor to perform the stream transform.
ICryptoTransform encryptor = aes.CreateEncryptor(aes.Key, aes.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
// Return the encrypted bytes from the memory stream.
return encrypted;
}
AES 是一种分组密码,因此它仅适用于恰好有一个分组大小的明文。像 CBC 这样的操作模式使您能够加密块大小的倍数的明文。要加密任意长度的明文,必须使用填充模式。
用于块密码的常见模式是 PKCS#5/PKCS#7:
aes.Padding = PaddingMode.PKCS7;