using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Ant.Service.Utility { public class EncodeHelper { #region 对称加密算法AES RijndaelManaged加密解密 private static readonly string Default_AES_Key = "@#kim123"; private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79, 0x53,0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F }; private static byte[] keyase = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f }; private static byte[] inputData = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }; /// /// 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法) /// /// 待加密字符串 /// 加密结果字符串 public static string AES_Encrypt(string encryptString) { return null; } /// /// 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法) /// /// 待加密字符串 /// 加密密钥,须半角字符 /// 加密结果字符串 public static string AES_Encrypt() { RijndaelManaged rijndaelProvider = new RijndaelManaged(); rijndaelProvider.Key = keyase; rijndaelProvider.IV = Keys; ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor(); byte[] inputData = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f }; byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length); return Convert.ToBase64String(encryptedData); } /// /// AES加密(无向量) /// /// 被加密的明文 /// 密钥 /// 密文 public static string AESEncrypttest() { MemoryStream mStream = new MemoryStream(); RijndaelManaged aes = new RijndaelManaged(); byte[] plainBytes = inputData; //Byte[] bKey = new Byte[16]; //Array.Copy(keyase, bKey, bKey.Length); aes.Mode = CipherMode.ECB; aes.Padding = PaddingMode.PKCS7; aes.KeySize = 128; //aes.Key = _key; aes.Key = keyase; //aes.IV = _iV; CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write); try { cryptoStream.Write(plainBytes, 0, plainBytes.Length); cryptoStream.FlushFinalBlock(); Byte[] str = new Byte[16]; str = mStream.ToArray(); return Convert.ToBase64String(str); } finally { cryptoStream.Close(); mStream.Close(); aes.Clear(); } } /// /// 对称加密算法AES RijndaelManaged解密字符串 /// /// 待解密的字符串 /// 解密成功返回解密后的字符串,失败返源串 public static string AES_Decrypt(string decryptString) { return AES_Decrypt(decryptString, Default_AES_Key); } /// /// 对称加密算法AES RijndaelManaged解密字符串 /// /// 待解密的字符串 /// 解密密钥,和加密密钥相同 /// 解密成功返回解密后的字符串,失败返回空 public static string AES_Decrypt(string decryptString, string decryptKey) { try { decryptKey = GetSubString(decryptKey, 32, ""); decryptKey = decryptKey.PadRight(32, ' '); RijndaelManaged rijndaelProvider = new RijndaelManaged(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey); 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 string.Empty; } } /// /// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分 /// /// 源字符串 /// 所取字符串字节长度 /// 附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...") /// 某字符串的一部分 private static string GetSubString(string sourceString, int length, string tailString) { return GetSubString(sourceString, 0, length, tailString); } /// /// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分 /// /// 源字符串 /// 索引位置,以0开始 /// 所取字符串字节长度 /// 附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...") /// 某字符串的一部分 private static string GetSubString(string sourceString, int startIndex, int length, string tailString) { string myResult = sourceString; //当是日文或韩文时(注:中文的范围:\u4e00 - \u9fa5, 日文在\u0800 - \u4e00, 韩文为\xAC00-\xD7A3) if (System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\u0800-\u4e00]+") || System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\xAC00-\xD7A3]+")) { //当截取的起始位置超出字段串长度时 if (startIndex >= sourceString.Length) { return string.Empty; } else { return sourceString.Substring(startIndex, ((length + startIndex) > sourceString.Length) ? (sourceString.Length - startIndex) : length); } } //中文字符,如"中国人民abcd123" if (length <= 0) { return string.Empty; } byte[] bytesSource = Encoding.Default.GetBytes(sourceString); //当字符串长度大于起始位置 if (bytesSource.Length > startIndex) { int endIndex = bytesSource.Length; //当要截取的长度在字符串的有效长度范围内 if (bytesSource.Length > (startIndex + length)) { endIndex = length + startIndex; } else { //当不在有效范围内时,只取到字符串的结尾 length = bytesSource.Length - startIndex; tailString = ""; } int[] anResultFlag = new int[length]; int nFlag = 0; //字节大于127为双字节字符 for (int i = startIndex; i < endIndex; i++) { if (bytesSource[i] > 127) { nFlag++; if (nFlag == 3) { nFlag = 1; } } else { nFlag = 0; } anResultFlag[i] = nFlag; } //最后一个字节为双字节字符的一半 if ((bytesSource[endIndex - 1] > 127) && (anResultFlag[length - 1] == 1)) { length = length + 1; } byte[] bsResult = new byte[length]; Array.Copy(bytesSource, startIndex, bsResult, 0, length); myResult = Encoding.Default.GetString(bsResult); myResult = myResult + tailString; return myResult; } return string.Empty; } /// /// 加密文件流 /// /// /// public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey) { decryptKey = GetSubString(decryptKey, 32, ""); decryptKey = decryptKey.PadRight(32, ' '); RijndaelManaged rijndaelProvider = new RijndaelManaged(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey); rijndaelProvider.IV = Keys; ICryptoTransform encrypto = rijndaelProvider.CreateEncryptor(); CryptoStream cytptostreamEncr = new CryptoStream(fs, encrypto, CryptoStreamMode.Write); return cytptostreamEncr; } /// /// 解密文件流 /// /// /// public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey) { decryptKey = GetSubString(decryptKey, 32, ""); decryptKey = decryptKey.PadRight(32, ' '); RijndaelManaged rijndaelProvider = new RijndaelManaged(); rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey); rijndaelProvider.IV = Keys; ICryptoTransform Decrypto = rijndaelProvider.CreateDecryptor(); CryptoStream cytptostreamDecr = new CryptoStream(fs, Decrypto, CryptoStreamMode.Read); return cytptostreamDecr; } /// /// 对指定文件加密 /// /// /// /// public static bool AES_EncryptFile(string InputFile, string OutputFile) { try { string decryptKey = "www.iqidi.com"; FileStream fr = new FileStream(InputFile, FileMode.Open); FileStream fren = new FileStream(OutputFile, FileMode.Create); CryptoStream Enfr = AES_EncryptStrream(fren, decryptKey); byte[] bytearrayinput = new byte[fr.Length]; fr.Read(bytearrayinput, 0, bytearrayinput.Length); Enfr.Write(bytearrayinput, 0, bytearrayinput.Length); Enfr.Close(); fr.Close(); fren.Close(); } catch { //文件异常 return false; } return true; } /// /// 对指定的文件解压缩 /// /// /// /// public static bool AES_DecryptFile(string InputFile, string OutputFile) { try { string decryptKey = "www.iqidi.com"; FileStream fr = new FileStream(InputFile, FileMode.Open); FileStream frde = new FileStream(OutputFile, FileMode.Create); CryptoStream Defr = AES_DecryptStream(fr, decryptKey); byte[] bytearrayoutput = new byte[1024]; int m_count = 0; do { m_count = Defr.Read(bytearrayoutput, 0, bytearrayoutput.Length); frde.Write(bytearrayoutput, 0, m_count); if (m_count < bytearrayoutput.Length) break; } while (true); Defr.Close(); fr.Close(); frde.Close(); } catch { //文件异常 return false; } return true; } #endregion } }