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 };
        /// <summary>
        /// AES加密,返回Base64编码后的字符
        /// </summary>
        /// <param name="plainText">明文字符串</param>
        /// <param name="strKey">密钥</param>
        /// <returns>返回加密后的Base64编码字符串</returns>
        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;
        }
        /// <summary>
        /// AES解密,返回解密后的字符串
        /// </summary>
        /// <param name="cipherText">Base64编码的密文</param>
        /// <param name="strKey">密钥</param>
        /// <returns>返回解密后的字符串</returns>
        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 加密/解密
        /// <summary>
        /// AES 加密
        /// </summary>
        /// <param name="str">明文(待加密)</param>
        /// <param name="key">密文</param>
        /// <returns></returns>
        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;
        }

        /// <summary>
        /// AES 解密
        /// </summary>
        /// <param name="str">明文(待解密)</param>
        /// <param name="key">密文</param>
        /// <returns></returns>
        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){
  //前后相同
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容