【发布时间】:2021-12-23 10:15:08
【问题描述】:
我正在尝试使用 AES-128、CFB 模式加密数据。下面的代码块适用于dotnet 5.x 目标框架,但给出了
输入的数据不是一个完整的块
bw.write() 错误,dotnet 4.7.2。理想情况下,它应该作为 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();
}
【问题讨论】:
-
SSL TLS 1.0 和 TLS 1.1 已过时。您必须使用 TLS 1.2 或 TLS 1.3 支持的加密模式。请参阅:en.wikipedia.org/wiki/…
-
与该客户端交互的服务器支持CFB模式,因此要求使用相同的加密。
-
.NET 中的 CFB 存在问题。使用 BouncyCastle,您可以避免这些问题,请参阅 here,BouncyCastle 部分。对于 CFB8 传递
8作为CfbBlockCipherctor 中的第二个参数。 -
谢谢@Topaco
-
你确定吗?加密模式必须满足 RFC 要求,
标签: c# .net cryptography aes