AESManaged Encryption / Decryption - 填充无效,无法删除 [英] AESManaged Encryption/Decryption - Padding is invalid and cannot be removed

查看:1002
本文介绍了AESManaged Encryption / Decryption - 填充无效,无法删除的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



所以我试图使用相同的密钥和IV来加密/解密这个字符串1234567890123456。加密运行正常,但是当尝试解密加密字符串时,我得到填充无效,不能删除异常。

 <$ c $ 

c> 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 decryptpted = 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 static class AESEncryption
{

  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 decryptpted =;

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))
{
decryptpted = sreader.ReadToEnd
}
}
}

}

return decrypted;
}

}


解决方案


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


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



如果错误,请纠正我。


I am coding an encryption/decryption aes utility with specific requirements: -AES/CBC/PKCS7 -256-Bit Key provided as base64 string -IV provided as base64 string

So I am trying to encryp/decrypt this string "1234567890123456" using the same key and IV. Encryption runs fine but when trying to decrypt the encrypted string I get the "Padding is invalid and cannot be removed" exception. What am I missing?

//This is the calling test method

     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);
         }

     }

//This is my Utility Class:

public static class 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;
    }

}

解决方案

If you want to use 256 bit key encryption then you need to switch to RijndaelManaged. Aes specification does not support variable key lengths. It only uses fixed key lengths (128, 192 or 256 bits).

As far as i know AES supports only a fixed blocksize of 128 bit but u can still use a 256 bit key. So if youre fine with a blocksize of 128 bit you can still stick with the aesmanaged class.

correct me if im wrong.

这篇关于AESManaged Encryption / Decryption - 填充无效,无法删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆