【问题标题】:AES encryption error: The input data is not a complete block?AES加密错误:输入数据不是一个完整的块?
【发布时间】:2013-10-27 03:04:08
【问题描述】:

加密方法如下:

public static byte[] Encrypt(byte[] plaintext, byte[] key)
{
    using (var aes = Aes.Create())
    {
        aes.BlockSize = 128;
        aes.Mode = CipherMode.ECB;
        aes.Padding = PaddingMode.None;

        var iv = new byte[16];
        for (int i = 0; i < iv.Length; i++)
            iv[i] = 0;
        aes.IV = iv;

        var encryptor = aes.CreateEncryptor(key, aes.IV);
        using(var target = new MemoryStream())
        using (var cs = new CryptoStream(target, encryptor, CryptoStreamMode.Write))
        {
            using (var source = new StreamWriter(cs))
                source.Write(plaintext);
            return target.ToArray();
        }
    }
}

我怎么称呼它:

var key = new byte[16] { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
var plaintext = new byte[16] { 128, 0, 112, 0, 96, 0, 80, 0, 64, 0, 48, 0, 32, 0, 16, 0 };

但是它一直在 source.Write(plaintext) 抛出一个异常,说它不是一个完整的块?我使用的是 16 字节/128 位数组,块大小设置为 128。我不明白有什么问题?

另外,只是为了阻止任何关于欧洲央行不好等的建议,这不是为了生产,我只是在玩。

【问题讨论】:

  • 顺便说一句,new byte[16] 已经初始化为 0
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 我的数据已损坏。我不得不从数据库中删除它并重新开始。

标签: c# encryption


【解决方案1】:

StreamWriter 将 UTF8 文本字符写入流。
您正在写 plaintext.ToString() 作为密文的文本。

这将返回"System.Byte[]",它不会转换为 16 字节的 UTF8。

【讨论】:

  • @Justin984 他的意思是如果你已经有一个字节数组,你不需要使用StreamWriter,因为那是为了将字符串转换为具有某种编码的字节数组(UTF-8 by默认)。只需使用Stream.Write() 直接将字节写入流。
【解决方案2】:

我认为问题出在填充模式上。除非您要加密的文本确实可以被 BlockSize 整除(以位为单位,或 BlockSize / 8 以字节为单位),否则您应该指定一个 PaddingMode 而非 None。

参见post here 示例代码

【讨论】:

    【解决方案3】:

    我把函数改成这样:

    public static byte[] Encrypt(byte[] plaintext, byte[] key)
    {
        using (var aes = Aes.Create())
        {
            aes.BlockSize = 128;
            aes.Mode = CipherMode.ECB;
            aes.Padding = PaddingMode.None;
    
            var encryptor = aes.CreateEncryptor(key, new byte[16]);
            using(var target = new MemoryStream())
            using (var cs = new CryptoStream(target, encryptor, CryptoStreamMode.Write))
            {
                cs.Write(plaintext, 0, plaintext.Length);
                return target.ToArray();
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      根据我所经历和解决的问题,我错过了加密它抱怨的字段,我只是在解密它。它正在保存一个纯明文并试图解密它。因此,请确保首先对抱怨的字段进行加密。谢谢

      【讨论】:

        【解决方案5】:

        这对 PowerShell 有效: 如果您在不使用 -key 选项的情况下加密了密码,则可能会发生这种情况。要修复它,请使用 -key 选项对其进行加密:

        ConvertFrom-SecureString -key $key
        

        【讨论】:

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