c# Aes加解密

using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Text;
namespace ConsoleApp1
{
    internal class Program
    {
        /// <summary>
        /// 
        /// </summary>
        /// <param name="args"></param>
        private static void Main(string[] args)
        {
            string IVString = "";//IV
            string key = "IE7XG5ORF7EA4JC5";//key
            string encrypt = "3duwmKQ5ED4FRz3UtSN2zMvrLOPEiGn9Fwj2oEJngww=";
            string decrypt = "3001004";
            //加密
            string encryptValue = AesEncrypt(decrypt, key, IVString);
            Console.WriteLine(encryptValue);
            Console.WriteLine(encryptValue.Equals(encrypt));
            Console.WriteLine("");
            //解密
            string decryptValue = AesDecrypt(encryptValue, key, IVString);
            Console.WriteLine(decryptValue);
            Console.WriteLine(decryptValue.Equals(decrypt));
            Console.Read();
        }
        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="str"></param>
        /// <param name="key"></param>
        /// <param name="IVString"></param>
        /// <returns></returns>
        public static string AesEncrypt(string str, string key, string IVString)
        {
            Encoding encoder = Encoding.UTF8;
            byte[] toEncryptArray = Encoding.UTF8.GetBytes(str);
            RijndaelManaged rm = new RijndaelManaged
            {
                Key = encoder.GetBytes(key),
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7,
                IV = encoder.GetBytes(IVString),
            };
            ICryptoTransform cTransform = rm.CreateEncryptor();
            byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
            return ToBCDStringLower(resultArray);
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="str"></param>
        /// <param name="key"></param>
        /// <param name="IVString"></param>
        /// <returns></returns>
        public static string AesDecrypt(string str, string key, string IVString)
        {
            Encoding encoder = Encoding.UTF8;
            using (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())
            {
                aes.Key = encoder.GetBytes(key);
                aes.IV = encoder.GetBytes(IVString);
                var enc = aes.CreateDecryptor(aes.Key, aes.IV);
                using (MemoryStream ms = new MemoryStream())
                {
                    using (CryptoStream cs = new CryptoStream(ms, enc, CryptoStreamMode.Write))
                    {
                        var bts = FromBCDString(str);
                        cs.Write(bts, 0, bts.Length);
                    }
                    return encoder.GetString(ms.ToArray());
                }
            }
        }
        public static byte[] FromBCDString(string buffer)
        {
            if (buffer == null) return null;
            int start = 0;
            int count = buffer.Length;
            bool inCase = false;
            byte cur = 0;
            int dataEnd = start + count;
            List<byte> lst = new List<byte>(count / 2);
            while (start < dataEnd)
            {
                byte num = (byte)buffer[start++];
                if (num == ' ' || num == ' ' || num == ' ' || num == ' ')
                {
                    if (inCase)
                    {
                        lst.Add((byte)(cur / 16));
                        inCase = false;
                    }
                    continue;
                }
                byte tmp = 0;
                if (num >= '0' && num <= '9')
                    tmp = (byte)(num - '0');
                else if (num >= 'a' && num <= 'f')
                    tmp = (byte)(num - 'a' + 10);
                else if (num >= 'A' && num <= 'F')
                    tmp = (byte)(num - 'A' + 10);
                else
                    throw new ArgumentException("需要传入一个正确的BCD字符串,BCD字符串中只能包含 0-9 A-F a-f 和空格,回车 制表符!");
                if (!inCase)
                {
                    cur = (byte)(tmp * 16);
                    inCase = true;
                }
                else
                {
                    cur += tmp;
                    inCase = false;
                    lst.Add(cur);
                }
            }
            if (inCase)
            {
                lst.Add((byte)(cur / 16));
                inCase = false;
            }
            return lst.ToArray();
        }
        public static string ToBCDStringLower(byte[] buffer)
        {
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < buffer.Length; i++)
            {
                sb.Append(buffer[i].ToString("x2"));
            }
            return sb.ToString();//result;
        }
    }
}
原文地址:https://www.cnblogs.com/94cool/p/10892983.html