【问题标题】:AESManaged Encryption/Decryption - Padding is invalid and cannot be removedAESManaged 加密/解密 - 填充无效且无法删除
【发布时间】:2010-10-15 16:58:53
【问题描述】:

我正在编写具有特定要求的加密/解密 aes 实用程序: -AES/CBC/PKCS7 -256 位密钥作为 base64 字符串提供 -IV 作为 base64 字符串提供

所以我尝试使用相同的密钥和 IV 加密/解密这个字符串“1234567890123456”。加密运行良好,但在尝试解密加密字符串时,出现“填充无效且无法删除”异常。我错过了什么?

//这是调用测试方法

     public void Test_AESEncryption_Decrypt()
     {
         try
         {
             var encoding = Encoding.ASCII;
             var key = encoding.GetString(Convert.FromBase64String("JVSwvtTHhGHKmH7HIj5clsfQRXGg9ZZ0cOojoAPcGg0="));
             var iv = encoding.GetString(Convert.FromBase64String("IgEfBiIIHBANIRccFhwJDg==")); 
             var strtoencrypt = "1234567890123456";
             var encrypted = AESEncryption.Encrypt(encoding,strtoencrypt, key, iv, CipherMode.CBC, PaddingMode.PKCS7,128);


             var decrypted = AESEncryption.Decrypt(encoding,encoding.GetString(encrypted), key, iv, CipherMode.CBC, PaddingMode.PKCS7,128);

             Assert.AreEqual(strtoencrypt, decrypted);
         }
         catch (Exception ex)
         {
             Assert.Fail(ex.Message);
         }

     }

//这是我的实用程序类:

公共静态类 AESEncryption {

    public static byte[] Encrypt(Encoding encoding, string strtoencrypt, string key, string iv, CipherMode mode, PaddingMode padding, int blocksize){

        var mstream = new MemoryStream();
        using (var aes = new AesManaged())
        {
            var keybytes = encoding.GetBytes(key);

            aes.BlockSize = blocksize;
            aes.KeySize = keybytes.Length * 8;
            aes.Key = keybytes;
            aes.IV = encoding.GetBytes(iv);
            aes.Mode = mode;
            aes.Padding = padding;


            using (var cstream = new CryptoStream(mstream, aes.CreateEncryptor(aes.Key, aes.IV), CryptoStreamMode.Write))
            {
                var bytesToEncrypt = encoding.GetBytes(strtoencrypt);
                cstream.Write(bytesToEncrypt, 0, bytesToEncrypt.Length);
                cstream.FlushFinalBlock();
            }

        }

        var encrypted = mstream.ToArray();
        return encrypted;
    }



    public static string Decrypt(Encoding encoding,string strencrypted, string key, string iv, CipherMode mode, PaddingMode padding, int blocksize)
    {

        var decrypted = "";

        using (var aes = new AesManaged())
        {
            var keybytes = encoding.GetBytes(key);

            aes.BlockSize = blocksize;
            aes.KeySize = keybytes.Length * 8;
            aes.Key = keybytes;
            aes.IV = encoding.GetBytes(iv);
            aes.Mode = mode;
            aes.Padding = padding;

            using (var mstream = new MemoryStream(encoding.GetBytes(strencrypted)))
            {
                using (var cstream = new CryptoStream(mstream, aes.CreateDecryptor(aes.Key, aes.IV), CryptoStreamMode.Read))
                {
                    using (var sreader = new StreamReader(cstream))
                    {
                        decrypted = sreader.ReadToEnd();
                    }
                }
            }

        }

        return decrypted;
    }

}

【问题讨论】:

    标签: c#-4.0 cryptography aes


    【解决方案1】:

    由于编码的原因,当它进入加密方法时,您的密钥长度为 56 字节,但如果您使用 AesManaged,则不能拥有此密钥,AesManaged 将只接受 16 字节(128 位)密钥,IV 相同.

    如果您想使用 256 位密钥加密,则需要切换到 RijndaelManaged。 Aes 规范不支持可变密钥长度。它只使用固定的密钥长度(128、192 或 256 位)。

    如果您需要可变密钥长度,那么您可能需要查看支持 8-128 位之间任何密钥长度的 RC2。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      如果你想使用 256 位密钥 加密然后你需要切换到 Rijndael 管理。 AES规范 不支持可变密钥长度。 它只使用固定的密钥长度(128, 192 或 256 位)。

      据我所知,AES 仅支持 128 位的固定块大小,但您仍然可以使用 256 位密钥。所以如果你对 128 位的块大小没问题,你仍然可以坚持使用 aesmanaged 类。

      如果我错了,请纠正我。

      【讨论】:

        【解决方案3】:

        你认为

        Encoding.ASCII.GetBytes(Encoding.ASCII.GetString(x))==x
        

        但这不适用于任意字节数组。

        如果确实需要将字节数组编码为字符串,则应使用 Base-64。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-03-15
          • 2011-12-25
          • 2018-07-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-05-16
          相关资源
          最近更新 更多