【问题标题】:The input data is not a complete block for CFB mode AES-128 encryption C#输入数据不是 CFB 模式 AES-128 加密 C# 的完整块
【发布时间】: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,您可以避免这些问题,请参阅 hereBouncyCastle 部分。对于 CFB8 传递 8 作为 CfbBlockCipher ctor 中的第二个参数。
  • 谢谢@Topaco
  • 你确定吗?加密模式必须满足 RFC 要求,

标签: c# .net cryptography aes


【解决方案1】:

问题已通过删除 Aes128.Padding = PaddingMode.None; 得到解决并让它被PKC7填充。同样正如@Topaco How to turn python AES function into C# code 所回答的那样,我将密文修剪为明文长度以删除填充后加密。

更新代码:

     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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多