c#-4.0 - AESManaged 加密/解密 - 填充无效且无法删除

标签 c#-4.0 cryptography aes

我正在编写一个具有特定要求的加密/解密 aes 实用程序: -AES/CBC/PKCS7 -256 位 key 以 base64 字符串形式提供 -IV 以 base64 字符串形式提供

所以我尝试使用相同的 key 和 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);
         }

     }

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

公共(public)静态类 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;
    }

}

最佳答案

由于编码原因,当它到达加密方法时,您的 key 是 56 字节长,但如果您使用 AesManaged,则不能拥有此 key ,AesManaged 将仅接受 16 字节(128 位) key ,IV 也相同.

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

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

希望这有帮助。

关于c#-4.0 - AESManaged 加密/解密 - 填充无效且无法删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3944405/

相关文章:

c# - 我可以在现有方法中发出 CIL 吗?

java - Java 加密体系结构 (JCA) 的 OpenSSL Java 绑定(bind)

database - Erlang 中的文本压缩

java - JWT 数字签名是如何保护的?

security - AES-128 的安全性如何?

asp.net-mvc-4 - 在 mvc4 中渲染主视图内的部分 View

c# - 动态执行方法

c# - new Foo { A = 1, } 错误或功能?

iphone - 使用 SecKeyWrapper 中断加密 16 个字节的 UTF8 (ccStatus == -4304)

security - 物联网解决方案的加密/安全策略