using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Edu.Common.Plugin; using Newtonsoft.Json.Linq; namespace Edu.Common { /// /// 加密帮助类 /// public class EncryptionHelper { #region 默认密钥定义 /// /// 默认加密密钥 /// public const string DefaultDESKey = @"12345678"; /// /// 默认加密向量 /// public const string DefaultDESIV = @"1234567812345678"; /// /// 默认加密密钥 /// public const string Default3DESKey = @"123456781234567812345678"; /// /// 默认加密向量 /// public const string Default3DESIV = @"1234567812345678"; /// /// 获取密钥 /// public const string DefaultAESKey = @"12345678123456781234567812345678"; /// /// 获取向量 /// public const string DefaultAESIV = @"1234567812345678"; /// /// 默认加密密钥 /// public const string DefaultRC2Key = @"1234567812345678"; /// /// 默认加密向量 /// public const string DefaultRC2IV = @"1234567812345678"; /// /// 默认的RSA公钥 /// public const string DefaultRSAPublicKey = @"xxx"; /// /// 默认的RSA密钥 /// public const string DefaultRSAPrivateKey = @"ccc"; #endregion #region 对称加密算法 #region AES加密算法 /// /// AES 加密 /// /// 明文(待加密) /// 密文 /// public static string AesEncrypt(string str, string key) { if (string.IsNullOrEmpty(str)) return null; Byte[] toEncryptArray = Encoding.UTF8.GetBytes(str); RijndaelManaged rm = new RijndaelManaged { Key = Encoding.UTF8.GetBytes(key), Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; ICryptoTransform cTransform = rm.CreateEncryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } /// /// AES 解密 /// /// 明文(待解密) /// 密文 /// public static string AesDecrypt(string str, string key) { if (string.IsNullOrEmpty(str)) return null; Byte[] toEncryptArray = Convert.FromBase64String(str); RijndaelManaged rm = new RijndaelManaged { Key = Encoding.UTF8.GetBytes(key), Mode = CipherMode.ECB, Padding = PaddingMode.PKCS7 }; ICryptoTransform cTransform = rm.CreateDecryptor(); Byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Encoding.UTF8.GetString(resultArray); } /// /// AES加密 /// /// 明文字符串 /// 加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key /// 加密向量(16到19字节) /// 是否是Base64编码,否则是16进制编码 /// 加密模式 /// 填充模式 /// 密文 public static string AESEncrypt(string plainStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); byte[] byteArray = Encoding.UTF8.GetBytes(plainStr); var encrypts = AESEncrypt(byteArray, key, iv, mode, padding); if (isBase64Code) return Convert.ToBase64String(encrypts); else return ToString(encrypts); } /// /// AES加密 /// /// 明文字节数组 /// 加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key /// 加密向量(16到19字节) /// 加密模式 /// 填充模式 /// public static byte[] AESEncrypt(byte[] plainbytes, string key = DefaultAESKey, string iv = DefaultAESIV, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); byte[] byteArray = plainbytes; byte[] encrypt = null; var aes = Rijndael.Create(); try { aes.Padding = padding; aes.Mode = mode; using var mStream = new MemoryStream(); using (CryptoStream cStream = new CryptoStream(mStream, aes.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); } encrypt = mStream.ToArray(); } catch { } aes.Clear(); return encrypt; } /// /// AES加密 /// /// 明文字节数组 /// 加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key /// 加密向量(16到19字节) /// 是否是Base64编码,否则是16进制编码 /// 加密模式 /// 填充模式 /// 密文 public static string AESEncrypt(byte[] plainbytes, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); var encrypts = AESEncrypt(plainbytes, key, iv, mode, padding); if (isBase64Code) return Convert.ToBase64String(encrypts); else return ToString(encrypts); } /// /// AES解密 /// /// 密文字符串 /// 加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key /// 加密向量(16到19字节) /// 是否是Base64编码,否则是16进制编码 /// 加密模式 /// 填充模式 /// 明文 public static string AESDecrypt(string encryptStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); byte[] byteArray; if (isBase64Code) byteArray = Convert.FromBase64String(encryptStr); else byteArray = ToBytes(encryptStr); string decrypt = null; var aes = Rijndael.Create(); try { aes.Mode = mode; aes.Padding = padding; using var mStream = new MemoryStream(); using var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write); cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); decrypt = Encoding.UTF8.GetString(mStream.ToArray()); } catch { } aes.Clear(); return decrypt; } /// /// AES解密 /// /// 密文字符串 /// 加密密钥支持128(16字节)、192(24字节)、256位(32字节)的key /// 加密向量(16到19字节) /// 是否是Base64编码,否则是16进制编码 /// 加密模式 /// 填充模式 /// 明文 public static byte[] AESDecryptToBytes(string encryptStr, string key = DefaultAESKey, string iv = DefaultAESIV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); byte[] byteArray; if (isBase64Code) byteArray = Convert.FromBase64String(encryptStr); else byteArray = ToBytes(encryptStr); byte[] decrypt = null; var aes = Rijndael.Create(); try { aes.Mode = mode; aes.Padding = padding; using var mStream = new MemoryStream(); using (var cStream = new CryptoStream(mStream, aes.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write)) { cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); } decrypt = mStream.ToArray(); } catch { } aes.Clear(); return decrypt; } #endregion #region RC2加密算法 /// /// RC2加密 /// /// 明文字符串 /// 加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串) /// 加密向量64位以上(8个字节上去字符串) /// 是否是Base64编码,否则是16进制编码 /// 加密模式 /// 填充模式 /// 密文 public static string RC2Encrypt(string plainStr, string key = DefaultRC2Key, string iv = DefaultRC2IV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); byte[] byteArray = Encoding.UTF8.GetBytes(plainStr); string encrypt = null; var rc2 = new RC2CryptoServiceProvider(); try { rc2.Padding = padding; rc2.Mode = mode; using var mStream = new MemoryStream(); using var cStream = new CryptoStream(mStream, rc2.CreateEncryptor(bKey, bIV), CryptoStreamMode.Write); cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); if (isBase64Code) encrypt = Convert.ToBase64String(mStream.ToArray()); else encrypt = ToString(mStream.ToArray()); } catch { } rc2.Clear(); return encrypt; } /// /// RC2解密 /// /// 明文字符串 /// 加密密钥支持40~128长度,可以每8位递增(5到16个长度的字符串) /// 加密向量64位以上(8个字节上去字符串) /// 是否是Base64编码,否则是16进制编码 /// 加密模式 /// 填充模式 /// 明文 public static string RC2Decrypt(string encryptStr, string key = DefaultRC2Key, string iv = DefaultRC2IV, bool isBase64Code = true, CipherMode mode = CipherMode.CBC, PaddingMode padding = PaddingMode.PKCS7) { byte[] bKey = Encoding.UTF8.GetBytes(key); byte[] bIV = Encoding.UTF8.GetBytes(iv); byte[] byteArray; if (isBase64Code) byteArray = Convert.FromBase64String(encryptStr); else byteArray = ToBytes(encryptStr); string decrypt = null; var rc2 = new RC2CryptoServiceProvider(); try { rc2.Mode = mode; rc2.Padding = padding; using var mStream = new MemoryStream(); using var cStream = new CryptoStream(mStream, rc2.CreateDecryptor(bKey, bIV), CryptoStreamMode.Write); cStream.Write(byteArray, 0, byteArray.Length); cStream.FlushFinalBlock(); decrypt = Encoding.UTF8.GetString(mStream.ToArray()); } catch { } rc2.Clear(); return decrypt; } #endregion #endregion #region 哈稀算法 #region 获取哈稀散列值 /// /// 使用md5计算散列 /// /// 要用MD5算散列的字节数据 /// 经过MD5算散列后的数据 public static byte[] Hash(byte[] source) { if ((source == null) || (source.Length == 0)) throw new ArgumentException("source is not valid"); var m = MD5.Create(); return m.ComputeHash(source); } /// /// 对传入的明文密码进行Hash加密,密码不能为中文 /// /// 需要加密的明文密码 /// 经过Hash加密的密码 public static string HashPassword(string oriPassword) { if (string.IsNullOrEmpty(oriPassword)) throw new ArgumentException("oriPassword is valid"); var acii = new ASCIIEncoding(); var hashedBytes = Hash(acii.GetBytes(oriPassword)); return ToString(hashedBytes); } /// /// 计算MD5 /// /// 要算MD5的字符串 /// 是否是Base64编码 /// MD5字符串 public static string HashMD5(string data, bool isBase64Code = false) { if (string.IsNullOrEmpty(data)) return ""; var md5 = new MD5CryptoServiceProvider(); byte[] bytes = Encoding.UTF8.GetBytes(data); bytes = md5.ComputeHash(bytes); md5.Clear(); if (isBase64Code) return Convert.ToBase64String(bytes); else return ToString(bytes); } /// /// 生成16位的MD5散列值 /// /// 要算MD5的字符串 /// public static string HashMD516(string data) { var md5 = new MD5CryptoServiceProvider(); byte[] bytes = Encoding.UTF8.GetBytes(data); return ToString(md5.ComputeHash(bytes)).Substring(8, 16); } /// /// 对字符串进行SHA1散列 /// /// 需要哈稀的字符串 /// /// 密文 public static string HashSHA1(string data, bool isBase64 = false) { var StrRes = Encoding.UTF8.GetBytes(data); HashAlgorithm iSHA = new SHA1CryptoServiceProvider(); StrRes = iSHA.ComputeHash(StrRes); if (isBase64) return Convert.ToBase64String(StrRes); else return ToString(StrRes); } /// /// SHA256加密,不可逆转 /// /// string data:被加密的字符串 /// /// 返回加密后的字符串 public static string HashSHA256(string data, bool isBase64 = false) { SHA256 s256 = new SHA256CryptoServiceProvider(); byte[] byte1 = Encoding.UTF8.GetBytes(data); byte1 = s256.ComputeHash(byte1); s256.Clear(); if (isBase64) return Convert.ToBase64String(byte1); else return ToString(byte1); } /// /// SHA384加密,不可逆转 /// /// string data:被加密的字符串 /// /// 返回加密后的字符串 public static string HashSHA384(string data, bool isBase64 = false) { SHA384 s384 = new SHA384CryptoServiceProvider(); byte[] byte1 = Encoding.UTF8.GetBytes(data); byte1 = s384.ComputeHash(byte1); s384.Clear(); if (isBase64) return Convert.ToBase64String(byte1); else return ToString(byte1); } /// /// SHA512加密,不可逆转 /// /// string data:被加密的字符串 /// /// 返回加密后的字符串 public static string HashSHA512(string data, bool isBase64 = false) { SHA512 s512 = new SHA512CryptoServiceProvider(); byte[] byte1 = Encoding.Default.GetBytes(data); byte1 = s512.ComputeHash(byte1); s512.Clear(); if (isBase64) return Convert.ToBase64String(byte1); else return ToString(byte1); } #endregion #region 带混淆字符串的散列 /// /// 对字符串进行HmacMD5散列 /// /// 密钥 /// 需要哈稀的字符串 /// /// 密文 public static string HmacMD5(string key, string data, bool isBase64 = false) { var StrRes = Encoding.UTF8.GetBytes(data); var bkey = Encoding.UTF8.GetBytes(key); var hmacSha1 = new HMACMD5(bkey); StrRes = hmacSha1.ComputeHash(StrRes); if (isBase64) return Convert.ToBase64String(StrRes); else return ToString(StrRes); } /// /// 对字符串进行HmacSHA1散列 /// /// 密钥 /// 需要哈稀的字符串 /// /// 密文 public static string HmacSHA1(string key, string data, bool isBase64 = false) { var StrRes = Encoding.UTF8.GetBytes(data); var bkey = Encoding.UTF8.GetBytes(key); HMACSHA1 hmacSha1 = new HMACSHA1(bkey); StrRes = hmacSha1.ComputeHash(StrRes); if (isBase64) return Convert.ToBase64String(StrRes); else return ToString(StrRes); } /// /// 对字符串进行HmacSHA256散列 /// /// 密钥 /// 需要哈稀的字符串 /// /// 密文 public static string HmacSHA256(string key, string data, bool isBase64 = false) { var StrRes = Encoding.UTF8.GetBytes(data); var bkey = Encoding.UTF8.GetBytes(key); var hmacSha1 = new HMACSHA256(bkey); StrRes = hmacSha1.ComputeHash(StrRes); if (isBase64) return Convert.ToBase64String(StrRes); else return ToString(StrRes); } /// /// 对字符串进行HmacSHA384散列 /// /// 密钥 /// 需要哈稀的字符串 /// /// 密文 public static string HmacSHA384(string key, string data, bool isBase64 = false) { var StrRes = Encoding.UTF8.GetBytes(data); var bkey = Encoding.UTF8.GetBytes(key); var hmacSha1 = new HMACSHA384(bkey); StrRes = hmacSha1.ComputeHash(StrRes); if (isBase64) return Convert.ToBase64String(StrRes); else return ToString(StrRes); } /// /// 对字符串进行HmacSHA512散列 /// /// 密钥 /// 需要哈稀的字符串 /// /// 密文 public static string HmacSHA512(string key, string data, bool isBase64 = false) { var StrRes = Encoding.UTF8.GetBytes(data); var bkey = Encoding.UTF8.GetBytes(key); var hmacSha1 = new HMACSHA512(bkey); StrRes = hmacSha1.ComputeHash(StrRes); if (isBase64) return Convert.ToBase64String(StrRes); else return ToString(StrRes); } #endregion #endregion #region 非对称加密算法 /// /// RSA加密 /// /// 明文 /// RSA公钥 /// 输出数据是否用Base64编码 /// public static string RSAEncrypt(string plaintData, string publicKey = DefaultRSAPublicKey, bool isBase64 = false) { var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(publicKey); var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintData), false); if (isBase64) return Convert.ToBase64String(cipherbytes); else return ToString(cipherbytes); } /// /// RSA解密 /// /// 密文 /// RSA私钥 /// 密文数据是否用Base64编码 /// public static string RSADecrypt(string encryptData, string privateKey = DefaultRSAPublicKey, bool isBase64 = false) { byte[] bData; if (isBase64) bData = Convert.FromBase64String(encryptData); else bData = ToBytes(encryptData); var rsa = new RSACryptoServiceProvider(); rsa.FromXmlString(privateKey); var cipherbytes = rsa.Decrypt(bData, false); return Encoding.UTF8.GetString(cipherbytes); } /// /// RSA加密 /// /// 明文 /// RSA公钥 /// 输出数据是否用Base64编码 /// public static string RSAEncrypt(string plaintData, RSAParameters publicKey, bool isBase64 = false) { var rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(publicKey); var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(plaintData), false); if (isBase64) return Convert.ToBase64String(cipherbytes); else return ToString(cipherbytes); } /// /// RSA解密 /// /// 密文 /// RSA私钥 /// 密文数据是否用Base64编码 /// public static string RSADecrypt(string encryptData, RSAParameters privateKey, bool isBase64 = false) { byte[] bData; if (isBase64) bData = Convert.FromBase64String(encryptData); else bData = ToBytes(encryptData); var rsa = new RSACryptoServiceProvider(); rsa.ImportParameters(privateKey); var cipherbytes = rsa.Decrypt(bData, false); return Encoding.UTF8.GetString(cipherbytes); } #endregion /// /// 转换字符流成字符串 /// /// /// private static string ToString(byte[] bytes) { var sb = new StringBuilder(64); foreach (byte iByte in bytes) sb.AppendFormat("{0:x2}", iByte); return sb.ToString(); } /// /// 转换成Byte数组 /// /// /// private static byte[] ToBytes(string hexString) { if (hexString == null) return null; var data = new byte[hexString.Length / 2]; int h, l; for (var i = 0; i < data.Length; i++) { h = (hexString[2 * i] > 57 ? hexString[2 * i] - 'A' + 10 : hexString[2 * i] - '0') << 4 & 0x000000F0; l = (hexString[2 * i + 1] > 57 ? hexString[2 * i + 1] - 'A' + 10 : hexString[2 * i + 1] - '0') & 0x0000000F; data[i] = (byte)(h | l); } return data; } /// /// 解析手机号码 /// /// /// /// /// public static string AES_decrypt(string encryptedData, string Session_key, string iv) { string phoneNum = ""; byte[] encryData = Convert.FromBase64String(encryptedData); // strToToHexByte(text); RijndaelManaged rijndaelCipher = new RijndaelManaged(); rijndaelCipher.Key = Convert.FromBase64String(Session_key); // Encoding.UTF8.GetBytes(AesKey); rijndaelCipher.IV = Convert.FromBase64String(iv);// Encoding.UTF8.GetBytes(AesIV); rijndaelCipher.Mode = CipherMode.CBC; rijndaelCipher.Padding = PaddingMode.PKCS7; ICryptoTransform transform = rijndaelCipher.CreateDecryptor(); byte[] plainText = transform.TransformFinalBlock(encryData, 0, encryData.Length); string result = Encoding.Default.GetString(plainText); if (!string.IsNullOrEmpty(result)) { var jObj = JObject.Parse(result); phoneNum = jObj.GetStringValue("phoneNumber"); } return phoneNum; } } }