c# Aes加解密

密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。.

该算法为比利时密码学家Joan Daemen和Vincent Rijmen所设计,结合两位作者的名字,以Rijdael之名命之,投稿高级加密标准的甄选流程。(Rijdael的发音近于 "Rhine doll"。)

c# Aes加解密

  /// <summary>
        /// 加密初始化向量
        /// </summary>
        private static string EnctyptIV
        {
            get
            {
                return EnctyptKey.Substring(0, 16);
            }
        }

        private static string EnctyptIVAmin
        {
            get
            {
                return EnctyptKeyAdmin.Substring(0, 16);
            }
        }

        /// <summary>
        /// 测试
        /// </summary>
        public static void Test()
        {
            //加密初始化向量
            string message = "abcdefghigklmnopqrstuvwxyz0123456789";
            Console.WriteLine("加密前:" + message);
            message = Encrypt(message, EnctyptKey, EnctyptIV);
            Console.WriteLine("加密后:" + message);
            message = Decrypt(message, EnctyptKey, EnctyptIV);
            Console.WriteLine("解密后:" + message);
        }

        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="text">明文</param>
        /// <returns></returns>
        public static string Encrypt(string text)
        {
            return Encrypt(text, EnctyptKey, EnctyptIV);
        }

        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="text">明文</param>
        /// <param name="key">密钥</param>
        /// <param name="iv">向量</param>
        /// <returns></returns>
        public static string Encrypt(string text, string key, string iv)
        {
            RijndaelManaged rijndaelManaged = new RijndaelManaged();
            rijndaelManaged.Mode = CipherMode.CBC;
            rijndaelManaged.Padding = PaddingMode.PKCS7;
            rijndaelManaged.KeySize = 128;
            rijndaelManaged.BlockSize = 128;

            byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);

            #region 无用代码

            //byte[] keyBytes = new byte[16];
            //int len = pwdBytes.Length;
            //if (len > keyBytes.Length)
            //{
            //    len = keyBytes.Length;
            //}
            //System.Array.Copy(pwdBytes, keyBytes, len);
            //rijndaelManaged.Key = keyBytes;

            #endregion 无用代码

            rijndaelManaged.Key = pwdBytes;

            byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
            rijndaelManaged.IV = ivBytes;

            ICryptoTransform iCryptoTransform = rijndaelManaged.CreateEncryptor();
            byte[] textBytes = Encoding.UTF8.GetBytes(text);
            byte[] targetBytes = iCryptoTransform.TransformFinalBlock(textBytes, 0, textBytes.Length);
            return Convert.ToBase64String(targetBytes);
        }

        /// <summary>
        /// AES加密
        /// </summary>
        /// <param name="text">明文</param>
        /// <param name="openEncrypt">是否开启加密</param>
        /// <returns></returns>
        public static string TryEncrypt(string text, bool openEncrypt = true)
        {
            if (string.IsNullOrEmpty(text))
                return text;
            if (openEncrypt)
            {
                return Encrypt(text, EnctyptKey, EnctyptIV);
            }
            return text;
        }

        public static string TryEncryptAdmin(string text, bool openEncrypt = true)
        {
            if (string.IsNullOrEmpty(text))
                return text;
            if (openEncrypt)
            {
                return Encrypt(text, EnctyptKeyAdmin, EnctyptIVAmin);
            }
            return text;
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="text">密文</param>
        /// <param name="openEncrypt">是否开启加密/解密</param>
        /// <returns></returns>
        public static string TryDecrypt(string text, bool openEncrypt = true)
        {
            if (string.IsNullOrEmpty(text))
                return text;
            try
            {
                if (openEncrypt)
                {
                    return Decrypt(text, EnctyptKey, EnctyptIV);
                }
            }
            catch (Exception ex) { }
            return text;
        }

        public static string TryDecryptAdmin(string text, bool openEncrypt = true)
        {
            if (string.IsNullOrEmpty(text))
                return text;
            try
            {
                if (openEncrypt)
                {
                    return Decrypt(text, EnctyptKeyAdmin, EnctyptIVAmin);
                }
            }
            catch (Exception ex) { }
            return text;
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="text">密文</param>
        /// <returns></returns>
        public static string Decrypt(string text)
        {
            return Decrypt(text, EnctyptKey, EnctyptIV);
        }

        /// <summary>
        /// AES解密
        /// </summary>
        /// <param name="text">密文</param>
        /// <param name="key">密钥</param>
        /// <param name="iv">向量</param>
        /// <returns></returns>
        public static string Decrypt(string text, string key, string iv)
        {
            if (string.IsNullOrEmpty(text))
                return text;
            RijndaelManaged rijndaelManaged = new RijndaelManaged();
            rijndaelManaged.Mode = CipherMode.CBC;
            rijndaelManaged.Padding = PaddingMode.PKCS7;
            rijndaelManaged.KeySize = 128;
            rijndaelManaged.BlockSize = 128;

            byte[] encryptedData = Convert.FromBase64String(text);
            byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(key);

            #region 无用代码

            //byte[] keyBytes = new byte[16];
            //int len = pwdBytes.Length;
            //if (len > keyBytes.Length)
            //{
            //    len = keyBytes.Length;
            //}
            //System.Array.Copy(pwdBytes, keyBytes, len);
            //rijndaelManaged.Key = keyBytes;

            #endregion 无用代码

            rijndaelManaged.Key = pwdBytes;

            byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);
            rijndaelManaged.IV = ivBytes;

            ICryptoTransform iCryptoTransform = rijndaelManaged.CreateDecryptor();
            byte[] targetBytes = iCryptoTransform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);
            return Encoding.UTF8.GetString(targetBytes);
        }
    }