【问题标题】:The input data is not a complete block when trying to encrypt a key尝试加密密钥时输入数据不是完整的块
【发布时间】:2019-12-22 17:16:02
【问题描述】:

我正在尝试加密一些密钥及其抛出 The input data is not a complete block。我在 stackoverflow 上尝试了一些答案,但似乎都不起作用!

代码如下:

public static string Encrypt(string value)
        {
            string EncryptionKey = "THISISSOMEENCRYPTIONKEY";
            byte[] clearBytes = Encoding.UTF8.GetBytes(value);
            using (Aes encryptor = Aes.Create())
            {
                encryptor.BlockSize = 128;
                encryptor.Mode = CipherMode.ECB;
                encryptor.Padding = PaddingMode.None;

                Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
                encryptor.Key = pdb.GetBytes(32);
                encryptor.IV = pdb.GetBytes(16);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(clearBytes, 0, clearBytes.Length);
                        cs.Close(); //the input data is not a complete block
                    }
                    value = Convert.ToBase64String(ms.ToArray());
                }
            }
            return value;
        }

附言我在ASP.NET Core 1.0 MVC 上的一些旧项目中有相同的代码并且它工作正常,而这个是 .NET Core 2.2 (Library) API,它给我抛出了那个错误!

【问题讨论】:

  • 哪一行报错了?

标签: c# .net encryption .net-core asp.net-core-webapi


【解决方案1】:

看看下面几行

Aes encryptor = Aes.Create()

encryptor.BlockSize = 128;
encryptor.Mode = CipherMode.ECB;
encryptor.Padding = PaddingMode.None;

AES 密码是一种对称块密码,要求输入与块大小完全匹配。如果输入长度与块大小不匹配,则使用padding(通常为对称密码的PKCS#7)将输入扩展为所需长度。

在代码中指定了PaddingMode.None,所以输入的长度必须与块大小匹配。

为了加密更长的输入(块大小的乘数),使用不同的modes of operation。对于您选择的参数输入长度需要是块大小的倍数(16 字节)。

请注意,某些模式可以有效地创建流密码并且不需要填充(CFB、OFB、CTR)

让我们试试吧:

encryptor.Mode = CipherMode.CBC;
encryptor.Padding = PaddingMode.PKCS7 

我在 ASP.NET Core 1.0 MVC 上的一些旧项目中使用了相同的代码,并且它可以正常工作

好吧-那么我们只能假设输入长度是块大小的倍数

其他安全说明:

  • 尽可能避免使用 ECB(有关操作模式,请参阅链接)
  • 其他模式需要唯一的 IV(CBC 模式需要不可预测/随机的 IV)。为多个输入派生(相同的)密钥和 IV 确实不安全

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多