我編碼與具體要求的加密/解密AES實用程序: -AES/CBC/PKCS7 -256位密鑰爲base64字符串提供作爲 -IV base64字符串AESManaged加密/解密 - 填充是無效的不能刪除
所以我試圖使用相同的密鑰和IV加密/解密此字符串「123456789」。加密運行正常,但試圖解密加密的字符串時,我得到「填充無效且無法移除」異常。我錯過了什麼?
//這是調用的測試方法
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 = "123456789";
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;
}
}