输入数据不是CFB模式AES-128加密C#的完整块



我正在尝试使用AES-128 CFB模式加密数据。以下代码块适用于dotnet 5.x目标框架,但给出

输入数据不是完整的块

dotnet 4.7.2bw.write()错误。理想情况下,它应该像CFB模式将块密码转换为不需要填充的流密码一样工作。我也尝试过csEncrypt.Write(dataToBeEncrypted, 0, dataToBeEncrypted.Length)而不是bw.Write()。在这种情况下,它在下一行失败,它将内存流转换为具有相同错误的数组。

using (AesCryptoServiceProvider Aes128 = new AesCryptoServiceProvider())
{
Aes128.BlockSize = 128;
Aes128.KeySize = 128;
//
// Specify CFB8 mode
//
Aes128.Mode = CipherMode.CFB;
Aes128.FeedbackSize = 8;
Aes128.Padding = PaddingMode.None;
//
// Generate and save random key and IV.
//
Aes128.GenerateIV();
Aes128.Key = key;
Aes128.IV.CopyTo(savedIV, 0);
using (var encryptor = Aes128.CreateEncryptor())
using (var msEncrypt = new MemoryStream())
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (var bw = new BinaryWriter(csEncrypt, Encoding.UTF8))
{
bw.Write(dataToBeEncrypted);
bw.Close();
cipherBytes = msEncrypt.ToArray();
}

通过删除Aes128解决了问题。Padding=PaddingMode.None;并让它被PKC7填充。同样正如@Topaco所回答的那样,如何将python AES函数转换为C#代码,我将密文修剪为明文长度,以删除加密后的填充。

更新代码:

using (AesCryptoServiceProvider Aes128 = new AesCryptoServiceProvider())
{
Aes128.BlockSize = 128;
Aes128.KeySize = 128;
//
// Specify CFB8 mode
//
Aes128.Mode = CipherMode.CFB;
Aes128.FeedbackSize = 8;
//
// Generate and save random key and IV.
//
Aes128.GenerateIV();
Aes128.Key = key;
Aes128.IV.CopyTo(savedIV, 0);
using (var encryptor = Aes128.CreateEncryptor())
using (var msEncrypt = new MemoryStream())
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
using (var bw = new BinaryWriter(csEncrypt, Encoding.UTF8))
{
Console.WriteLine("About to binary write.");
bw.Write(dataToBeEncrypted);
bw.Close();
Console.WriteLine("binary write successful.");
cipherBytesWithPadding = msEncrypt.ToArray();
}
Buffer.BlockCopy(cipherBytesWithPadding, 0, cipherBytes, 0, dataToBeEncrypted.Length);

最新更新