C# AES加接密

有时间我们在做数据传输的时候,特别是api接口调用并传输数据时,需要加密

废话不多说直接上代码

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace Utils
{
    public class AesTool
    {        

        private string key = "abcde234123@#ew9182h4r1238132&AUIFQEIfaidsfnqeiqewrndsifqnwqiwernqewiqeiqe";
        private string iv = "s9afn1@#$!#asdfiqwnerasidfnqwiesndaf912#$!@341";

        ///
        private string encrption(string input, string key, string iv)
        {
            MemoryStream msEncrypt = null;
            RijndaelManaged aesAlg = null;

            string sresult = string.Empty;

            try
            {
                byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
                byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);
                aesAlg = new RijndaelManaged();

                aesAlg.Key = keys;
                aesAlg.IV = ivs;

                ICryptoTransform ict = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
                msEncrypt = new MemoryStream();

                using (CryptoStream cts = new CryptoStream(msEncrypt, ict, CryptoStreamMode.Write))
                {
                    using (StreamWriter sw = new StreamWriter(cts))
                    {
                        sw.Write(input);
                    }
                }

            }
            finally
            {
                if (aesAlg != null)
                {
                    aesAlg.Dispose();
                    aesAlg.Clear();
                }
            }

            if (msEncrypt != null)
            {
                byte[] content = msEncrypt.ToArray();

                sresult = Convert.ToBase64String(content);
            }

            return sresult;
        }

        private string decrption(string input, string key, string iv)
        {
            string sresult = string.Empty;

            byte[] keys = System.Text.Encoding.UTF8.GetBytes(key);
            byte[] ivs = System.Text.Encoding.UTF8.GetBytes(iv);

            byte[] inputbytes = Convert.FromBase64String(input);

            RijndaelManaged rm = null;

            try
            {
                rm = new RijndaelManaged();
                rm.Key = keys;
                rm.IV = ivs;

                ICryptoTransform ict = rm.CreateDecryptor(rm.Key, rm.IV);

                using (MemoryStream ms = new MemoryStream(inputbytes))
                {
                    using (CryptoStream cs = new CryptoStream(ms, ict, CryptoStreamMode.Read))
                    {
                        using (StreamReader sr = new StreamReader(cs))
                        {
                            sresult = sr.ReadToEnd();
                        }
                    }
                }

            }
            finally
            {
                if (rm != null)
                {
                    rm.Dispose();
                    rm.Clear();
                }
            }

            return sresult;
        }


        //默认密钥向量 
        private static byte[] _Aeskey = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
        /// 
        /// AES加密,返回Base64编码后的字符
        /// 
        /// 明文字符串
        /// 密钥
        /// 返回加密后的Base64编码字符串
        public static string EncryptAES(string plainText, string strKey = "123456")
        {
            byte[] byteArray = Encoding.UTF8.GetBytes(plainText);
            Byte[] bKey = new Byte[32];
            Array.Copy(Encoding.UTF8.GetBytes(strKey.PadRight(bKey.Length)), bKey, bKey.Length);
            RijndaelManaged rDel = new RijndaelManaged();
            // rDel.Key = Encoding.UTF8.GetBytes(strKey);
            rDel.Key = bKey;
            rDel.IV = _Aeskey;
            rDel.BlockSize = 128;
            rDel.Mode = CipherMode.ECB;//设置为ECB
            rDel.Padding = PaddingMode.PKCS7;//设置为PKCS7,否则解密后字符串结尾会出现多余字符
            ICryptoTransform cTransform = rDel.CreateEncryptor();
            var s = cTransform.TransformFinalBlock(byteArray, 0, byteArray.Length);
            var encrypt = Convert.ToBase64String(s);
            rDel.Clear();
            return encrypt;
        }
        /// 
        /// AES解密,返回解密后的字符串
        /// 
        /// Base64编码的密文
        /// 密钥
        /// 返回解密后的字符串
        public static string DecryptAES(string cipherText, string strKey = "123456")
        {
            byte[] byteArray = Convert.FromBase64String(cipherText);
            Byte[] bKey = new Byte[32];
            Array.Copy(Encoding.UTF8.GetBytes(strKey.PadRight(bKey.Length)), bKey, bKey.Length);
            RijndaelManaged rDel = new RijndaelManaged();
            rDel.Key = bKey;
            rDel.IV = _Aeskey;
            rDel.BlockSize = 128;
            rDel.Mode = CipherMode.ECB;//必须设置为ECB,要与加密的模式一致
            rDel.Padding = PaddingMode.PKCS7;//必须设置为PKCS7,要与加密的模式一致
            ICryptoTransform cTransform = rDel.CreateDecryptor();
            var s = cTransform.TransformFinalBlock(byteArray, 0, byteArray.Length);
            var decrypt = Encoding.UTF8.GetString(s);
            rDel.Clear();
            return decrypt;
        }



        #region AES 加密/解密
        /// 
        /// AES 加密
        /// 
        /// 明文(待加密)
        /// 密文
        /// 
        public static string AesEncryptToHex(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); //命名空间: using System.Text;

            System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = System.Security.Cryptography.CipherMode.ECB,
                Padding = System.Security.Cryptography.PaddingMode.PKCS7
            };

            System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateEncryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            var hex = BitConverter.ToString(resultArray, 0).Replace("-", string.Empty).ToLower();
            return hex;
        }

        /// 
        /// AES 解密
        /// 
        /// 明文(待解密)
        /// 密文
        /// 
        public static string AesDecryptFromHex(string str, string key)
        {
            if (string.IsNullOrEmpty(str)) return null;
            var toEncryptArray = new byte[str.Length / 2];
            for (var x = 0; x < toEncryptArray.Length; x++)
            {
                var i = Convert.ToInt32(str.Substring(x * 2, 2), 16);
                toEncryptArray[x] = (byte)i;
            }

            //Byte[] toEncryptArray = Convert.FromBase64String(str);

            System.Security.Cryptography.RijndaelManaged rm = new System.Security.Cryptography.RijndaelManaged
            {
                Key = Encoding.UTF8.GetBytes(key),
                Mode = System.Security.Cryptography.CipherMode.ECB,
                Padding = System.Security.Cryptography.PaddingMode.PKCS7
            };

            System.Security.Cryptography.ICryptoTransform cTransform = rm.CreateDecryptor();
            Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

            return Encoding.UTF8.GetString(resultArray);
        }
        #endregion
    }
}

调用

//加密密匙
string key = "adhakdhakfai78123871";
//要加密的明文数据
stirng data="admin=张三|age=23|phone=13167898877";

//加密
string str = AesTool.AesEncryptToHex(data,key);


//解密
string str2= AesTool.AesDecryptFromHex(str,key);


if(data == str2){
  //前后相同
}

你可能感兴趣的:(C# AES加接密)