通常, 我们在用.NET System.Security.Cryptography命名空间下面的DES/RijndaelManaged之类的加密解密时, 会发现加密很正常, 很顺利, 但解密的时候却出错说"填充无效, 无法被移除", 这是为什么呢?
我们先看看一般的加密解密的写法 (以RijndaelManaged为例)

Encrypt
1
public string Encrypt(string plainText)
2
{
3
string ciperText = "";
4
try
5
{
6
byte[] bPlainText = Encoding.ASCII.GetBytes(plainText);
7
RijndaelManaged rijndael = new RijndaelManaged();
8
ICryptoTransform transform = rijndael.CreateEncryptor(KEYData, IVData);
9
MemoryStream ms = new MemoryStream();
10
CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Write);
11
cs.Write(bPlainText, 0, bPlainText.Length);
12
cs.FlushFinalBlock();
13
14
ciperText = Convert.ToBase64String(ms.ToArray());
15
ms.Close();
16
cs.Close();
17
}
18
catch
{ }
19
return ciperText;
20
}
一般来说, 我们会把加密后的字符串转换成Base64String, 以其得到一个较为正常的加密字符串, 而问题就出现在这里, 转成Base64String之后的字符串如果用一般的Encoding来转换Byte数组的话, 会发生类似不兼容的情形出现(具体原因不太清楚, 似乎Base64String会用3字节来转换, 可能是这个原因导致其他的Encoding转换失败), 所以, Base64的加密字符串再转换成Base64的Byte数组, 那么, 问题就迎刃而解了, 如下面的Code

Decrypt
1
public string Decrypt(string cipherText)
2
{
3
string plainText = "";
4
try
5
{
6
RijndaelManaged rijndael = new RijndaelManaged();
7
ICryptoTransform transform = rijndael.CreateDecryptor(KEYData, IVData);
8
byte[] bCipherText = Convert.FromBase64String(cipherText);//这里要用这个函数来正确转换Base64字符串成Byte数组
9
MemoryStream ms = new MemoryStream(bCipherText);
10
CryptoStream cs = new CryptoStream(ms, transform, CryptoStreamMode.Read);
11
byte[] bPlainText = new byte[bCipherText.Length];
12
cs.Read(bPlainText, 0, bPlainText.Length);
13
plainText = Encoding.ASCII.GetString(bPlainText);
14
plainText = plainText.Trim('\0');
15
}
16
catch
{ }
17
return plainText;
18
}