AES解密
#region aes解密 private static readonly Encoding CHARSET = Encoding.UTF8; /// <summary> /// 解密给定的AES加密文本 /// </summary> /// <param name="text">需要解密的文本</param> /// <param name="aesKey">AES密钥</param> /// <returns>解密后的文本</returns> /// <exception cref="SecurityException">解密失败抛出异常</exception> public static string Decrypt(string text, string aesKey) { byte[] original; try { // 使用Aes类创建AES解密对象 using Aes aes = Aes.Create(); aes.Key = Convert.FromBase64String(aesKey); aes.Mode = CipherMode.CBC; aes.Padding = PaddingMode.None; aes.IV = aes.Key.Take(16).ToArray(); // 解密过程 byte[] encrypted = Convert.FromBase64String(text); using ICryptoTransform decryptor = aes.CreateDecryptor(); original = decryptor.TransformFinalBlock(encrypted, 0, encrypted.Length); } catch (System.Exception e) { Console.WriteLine(e.StackTrace); throw new SecurityException("aes解密失败", e); } string xmlContent; try { // 对解密后的byte[]数组进行解码 byte[] bytes = PKCS7Encoder.Decode(original); // 获取XML长度并解密XML文本 byte[] networkOrder = bytes.Skip(16).Take(4).ToArray(); int xmlLength = RecoverNetworkBytesOrder(networkOrder); xmlContent = CHARSET.GetString(bytes.Skip(20).Take(xmlLength).ToArray()); } catch (System.Exception e) { Console.WriteLine(e.StackTrace); throw new SecurityException("解密后得到的buffer非法", e); } return xmlContent; } // 恢复网络字节序,将byte数组转为int类型 private static int RecoverNetworkBytesOrder(byte[] orderBytes) { int sourceNumber = 0; for (int i = 0; i < 4; i++) { sourceNumber <<= 8; sourceNumber |= orderBytes[i] & 0xff; } return sourceNumber; } // PKCS7编码类,提供PKCS7编码方式的实现 private class PKCS7Encoder { private const int BLOCK_SIZE = 32; // PKCS7解码实现 public static byte[] Decode(byte[] decrypted) { int pad = (int)decrypted[decrypted.Length - 1]; if (pad < 1 || pad > BLOCK_SIZE) { pad = 0; } return decrypted.Take(decrypted.Length - pad).ToArray(); } } #endregion