AESManaged Encryption / Decryption - 填充无效,无法删除

时间:2010-10-15 16:58:54

标签: c#-4.0 cryptography aes

我正在使用特定要求对加密/解密aes实用程序进行编码: -AES / CBC / PKCS7 -256-Bit Key以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;
    }

}

3 个答案:

答案 0 :(得分:2)

当你的密钥由于编码而到达加密方法时,你的密钥长56个字节,但是如果你使用AesManaged,AesManaged只能接受16字节(128位)密钥并且相同的IV

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

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

希望这有帮助。

答案 1 :(得分:2)

  

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

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

如果我错了,请纠正我。

答案 2 :(得分:0)

你认为

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

但对于任意字节数组都不是这样。

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