using System; using System.Security.Cryptography; using System.Text; using Hh.Mes.Common.log; namespace Hh.Mes.Common { public class Encryption { private static string encryptKey = "4h!@w$rng,i#$@x1%)5^3(7*5P31/Ee0"; //默认密钥向量 private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79, 0x53, 0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F }; /// <summary> /// 加密 /// </summary> /// <param name="encryptString"></param> /// <returns></returns> public static string Encrypt(string encryptString) { if (string.IsNullOrEmpty(encryptString)) return string.Empty; Aes rijndaelProvider = Aes.Create(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32)); rijndaelProvider.IV = Keys; ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor(); byte[] inputData = Encoding.UTF8.GetBytes(encryptString); byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length); return Convert.ToBase64String(encryptedData); } /// <summary> /// 解密 /// </summary> /// <param name="decryptString"></param> /// <returns></returns> public static string Decrypt(string decryptString) { if (string.IsNullOrEmpty(decryptString)) return string.Empty; try { Aes rijndaelProvider = Aes.Create(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32)); rijndaelProvider.IV = Keys; ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor(); byte[] inputData = Convert.FromBase64String(decryptString); byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length); return Encoding.UTF8.GetString(decryptedData); } catch { return ""; } } /// <summary> /// AES加密 /// </summary> /// <param name="source"></param> /// <param name="key">密钥</param> /// <param name="iv">初始向量</param> /// <param name="padding">填充模式</param> /// <param name="mode">加密模式</param> /// <returns></returns> public static (bool isOk, string text) AESEncrypt(string source, string key, string iv = "", PaddingMode padding = PaddingMode.Zeros, CipherMode mode = CipherMode.CBC) { try { byte[] keyBytes = Encoding.UTF8.GetBytes(key); byte[] textBytes = Encoding.UTF8.GetBytes(source); byte[] ivBytes = Encoding.UTF8.GetBytes(iv); byte[] useKeyBytes = new byte[16]; byte[] useIvBytes = new byte[16]; Array.Copy(keyBytes, useKeyBytes, keyBytes.Length > useKeyBytes.Length ? useKeyBytes.Length : keyBytes.Length); Array.Copy(ivBytes, useIvBytes, ivBytes.Length > useIvBytes.Length ? useIvBytes.Length : ivBytes.Length); Aes aes = Aes.Create(); aes.KeySize = 256;//秘钥的大小,以位为单位,128,256等 aes.BlockSize = 128;//支持的块大小 aes.Padding = padding;//填充模式 aes.Mode = mode; aes.Key = useKeyBytes; aes.IV = useIvBytes;//初始化向量,如果没有设置默认的16个0 ICryptoTransform cryptoTransform = aes.CreateEncryptor(); byte[] resultBytes = cryptoTransform.TransformFinalBlock(textBytes, 0, textBytes.Length); return (true, Convert.ToBase64String(resultBytes)); } catch (Exception ex) { return (false, ex.Message); } } /// <summary> /// AES解密 /// </summary> /// <param name="source"></param> /// <param name="key">密钥</param> /// <param name="iv">初始向量</param> /// <param name="padding">填充模式</param> /// <param name="mode">加密模式</param> /// <returns></returns> public static (bool isOk, string text) AESDecrypt(string source, string key, string iv = "", PaddingMode padding = PaddingMode.Zeros, CipherMode mode = CipherMode.CBC) { try { byte[] textBytes = Convert.FromBase64String(source); byte[] keyBytes = Encoding.UTF8.GetBytes(key); byte[] ivBytes = Encoding.UTF8.GetBytes(iv); byte[] useKeyBytes = new byte[16]; byte[] useIvBytes = new byte[16]; Array.Copy(keyBytes, useKeyBytes, keyBytes.Length > useKeyBytes.Length ? useKeyBytes.Length : keyBytes.Length); Array.Copy(ivBytes, useIvBytes, ivBytes.Length > useIvBytes.Length ? useIvBytes.Length : ivBytes.Length); Aes aes = Aes.Create(); aes.KeySize = 256;//秘钥的大小,以位为单位,128,256等 aes.BlockSize = 128;//支持的块大小 aes.Padding = padding;//填充模式 aes.Mode = mode; aes.Key = useKeyBytes; aes.IV = useIvBytes;//初始化向量,如果没有设置默认的16个0 ICryptoTransform decryptoTransform = aes.CreateDecryptor(); byte[] resultBytes = decryptoTransform.TransformFinalBlock(textBytes, 0, textBytes.Length); return (true, Encoding.UTF8.GetString(resultBytes).Replace("\0", "")); } catch (Exception ex) { Log4NetHelper.Instance.Error("【AESDecrypt】" + ex.Message); return (false, ex.Message); } } //private static string ENCRY_ALGORITHM = "AES"; //private static string CIPHER_MODE = "AES/ECB/PKCS5Padding"; /// <summary> /// AES解密OA /// </summary> /// <param name="encryptStr"></param> /// <param name="decryptKey"></param> /// <returns></returns> public static string AesDecryptOA(string encryptStr, string decryptKey) { try { byte[] encryptByte = Convert.FromBase64String(encryptStr); using (Aes aes = Aes.Create()) { aes.Key = Encoding.UTF8.GetBytes(decryptKey); aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; using (ICryptoTransform decryptor = aes.CreateDecryptor()) { byte[] clearTextBytes = decryptor.TransformFinalBlock(encryptByte, 0, encryptByte.Length); return Encoding.UTF8.GetString(clearTextBytes); } } } catch (CryptographicException ex) { Log4NetHelper.Instance.Error("【AesDecryptOA】" + ex.Message); } catch (Exception ex) { Log4NetHelper.Instance.Error("【AesDecryptOA】" + ex.Message); } return null; } } }