本文介绍了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;
}

}


解决方案

知道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;
    }

}
解决方案

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 - 填充无效,无法删除的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-14 20:24