using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;
namespace ryCommon
{
    class clsAES
    {
        //默认密钥向量 
        private static byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
        /// <summary>
        /// AES加密算法
        /// </summary>
        /// <param name="plainText">明文字符串</param>
        /// <param name="strKey">密钥</param>
        /// <returns>返回加密后的密文字节数组</returns>
        public static byte[] AESEncrypt(string plainText, string strKey)
        {
            //分组加密算法
            SymmetricAlgorithm des = Rijndael.Create();
            byte[] inputByteArray = Encoding.UTF8.GetBytes(plainText);//得到需要加密的字节数组
            //设置密钥及密钥向量
            des.Key = Encoding.UTF8.GetBytes(strKey);
            des.IV = _key1;
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            byte[] cipherBytes = ms.ToArray();//得到加密后的字节数组
            cs.Close();
            ms.Close();
            return cipherBytes;
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="cipherText">密文字节数组</param>
        /// <param name="strKey">密钥</param>
        /// <returns>返回解密后的字符串</returns>
        public static byte[] AESDecrypt(byte[] cipherText, string strKey)
        {
            SymmetricAlgorithm des = Rijndael.Create();
            des.Key = Encoding.UTF8.GetBytes(strKey);
            des.IV = _key1;
            byte[] decryptBytes = new byte[cipherText.Length];
            MemoryStream ms = new MemoryStream(cipherText);
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Read);
            cs.Read(decryptBytes, 0, decryptBytes.Length);
            cs.Close();
            ms.Close();
            return decryptBytes;
        }
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="Message"></param>
        /// <returns></returns>
        public static string Encode(string data,string pass)
        {
            byte[] encryptBytes = AESEncrypt(data, ConvertKey(pass));
            return Convert.ToBase64String(encryptBytes);
            //将加密后的密文转换为Base64编码，以便显示，可以查看下结果
        }
        /// <summary>
        /// 解码
        /// </summary>
        /// <param name="Message"></param>
        /// <returns></returns>
        public static string Decode(string data, string pass)
        {
            try
            {
                //解密
                byte[] decryptBytes = AESDecrypt(Convert.FromBase64String(data), ConvertKey(pass));
                //将解密后的结果转换为字符串,也可以将该步骤封装在解密算法中
                string result = Encoding.UTF8.GetString(decryptBytes);
                return result.Replace("\0", "");
            }
            catch
            {
                return "";
            }
        }
        public static string GetMD5(string str)
        {
            StringBuilder sb = new StringBuilder();
            foreach (byte b in System.Security.Cryptography.MD5.Create().ComputeHash(Encoding.UTF8.GetBytes(str)))
            {
                sb.Append(b.ToString("X2"));
            }
            return sb.ToString();
        }
        /// <summary>
        /// 转换密钥到合法密钥
        /// </summary>
        /// <param name="pass"></param>
        /// <returns></returns>
        public static string ConvertKey(string pass)
        {
            string sxStr = GetMD5(pass);
            if (sxStr.Length > 32)
            {
                return sxStr.Substring(0, 32);
            }
            else
            {
                return (sxStr + sxStr).Substring(0, 32);
            }
        }
    }
}
