EncodeHelper.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8. namespace Ant.Service.Utility
  9. {
  10. public class EncodeHelper
  11. {
  12. #region 对称加密算法AES RijndaelManaged加密解密
  13. private static readonly string Default_AES_Key = "@#kim123";
  14. private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79,
  15. 0x53,0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };
  16. private static byte[] keyase = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };
  17. private static byte[] inputData = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f };
  18. /// <summary>
  19. /// 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)
  20. /// </summary>
  21. /// <param name="encryptString">待加密字符串</param>
  22. /// <returns>加密结果字符串</returns>
  23. public static string AES_Encrypt(string encryptString)
  24. {
  25. return null;
  26. }
  27. /// <summary>
  28. /// 对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)
  29. /// </summary>
  30. /// <param name="encryptString">待加密字符串</param>
  31. /// <param name="encryptKey">加密密钥,须半角字符</param>
  32. /// <returns>加密结果字符串</returns>
  33. public static string AES_Encrypt()
  34. {
  35. RijndaelManaged rijndaelProvider = new RijndaelManaged();
  36. rijndaelProvider.Key = keyase;
  37. rijndaelProvider.IV = Keys;
  38. ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
  39. byte[] inputData = { 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f };
  40. byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);
  41. return Convert.ToBase64String(encryptedData);
  42. }
  43. /// <summary>
  44. /// AES加密(无向量)
  45. /// </summary>
  46. /// <param name="plainBytes">被加密的明文</param>
  47. /// <param name="key">密钥</param>
  48. /// <returns>密文</returns>
  49. public static string AESEncrypttest()
  50. {
  51. MemoryStream mStream = new MemoryStream();
  52. RijndaelManaged aes = new RijndaelManaged();
  53. byte[] plainBytes = inputData;
  54. //Byte[] bKey = new Byte[16];
  55. //Array.Copy(keyase, bKey, bKey.Length);
  56. aes.Mode = CipherMode.ECB;
  57. aes.Padding = PaddingMode.PKCS7;
  58. aes.KeySize = 128;
  59. //aes.Key = _key;
  60. aes.Key = keyase;
  61. //aes.IV = _iV;
  62. CryptoStream cryptoStream = new CryptoStream(mStream, aes.CreateEncryptor(), CryptoStreamMode.Write);
  63. try
  64. {
  65. cryptoStream.Write(plainBytes, 0, plainBytes.Length);
  66. cryptoStream.FlushFinalBlock();
  67. Byte[] str = new Byte[16];
  68. str = mStream.ToArray();
  69. return Convert.ToBase64String(str);
  70. }
  71. finally
  72. {
  73. cryptoStream.Close();
  74. mStream.Close();
  75. aes.Clear();
  76. }
  77. }
  78. /// <summary>
  79. /// 对称加密算法AES RijndaelManaged解密字符串
  80. /// </summary>
  81. /// <param name="decryptString">待解密的字符串</param>
  82. /// <returns>解密成功返回解密后的字符串,失败返源串</returns>
  83. public static string AES_Decrypt(string decryptString)
  84. {
  85. return AES_Decrypt(decryptString, Default_AES_Key);
  86. }
  87. /// <summary>
  88. /// 对称加密算法AES RijndaelManaged解密字符串
  89. /// </summary>
  90. /// <param name="decryptString">待解密的字符串</param>
  91. /// <param name="decryptKey">解密密钥,和加密密钥相同</param>
  92. /// <returns>解密成功返回解密后的字符串,失败返回空</returns>
  93. public static string AES_Decrypt(string decryptString, string decryptKey)
  94. {
  95. try
  96. {
  97. decryptKey = GetSubString(decryptKey, 32, "");
  98. decryptKey = decryptKey.PadRight(32, ' ');
  99. RijndaelManaged rijndaelProvider = new RijndaelManaged();
  100. rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
  101. rijndaelProvider.IV = Keys;
  102. ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
  103. byte[] inputData = Convert.FromBase64String(decryptString);
  104. byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
  105. return Encoding.UTF8.GetString(decryptedData);
  106. }
  107. catch
  108. {
  109. return string.Empty;
  110. }
  111. }
  112. /// <summary>
  113. /// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分
  114. /// </summary>
  115. /// <param name="sourceString">源字符串</param>
  116. /// <param name="length">所取字符串字节长度</param>
  117. /// <param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")</param>
  118. /// <returns>某字符串的一部分</returns>
  119. private static string GetSubString(string sourceString, int length, string tailString)
  120. {
  121. return GetSubString(sourceString, 0, length, tailString);
  122. }
  123. /// <summary>
  124. /// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分
  125. /// </summary>
  126. /// <param name="sourceString">源字符串</param>
  127. /// <param name="startIndex">索引位置,以0开始</param>
  128. /// <param name="length">所取字符串字节长度</param>
  129. /// <param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")</param>
  130. /// <returns>某字符串的一部分</returns>
  131. private static string GetSubString(string sourceString, int startIndex, int length, string tailString)
  132. {
  133. string myResult = sourceString;
  134. //当是日文或韩文时(注:中文的范围:\u4e00 - \u9fa5, 日文在\u0800 - \u4e00, 韩文为\xAC00-\xD7A3)
  135. if (System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\u0800-\u4e00]+") ||
  136. System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\xAC00-\xD7A3]+"))
  137. {
  138. //当截取的起始位置超出字段串长度时
  139. if (startIndex >= sourceString.Length)
  140. {
  141. return string.Empty;
  142. }
  143. else
  144. {
  145. return sourceString.Substring(startIndex,
  146. ((length + startIndex) > sourceString.Length) ? (sourceString.Length - startIndex) : length);
  147. }
  148. }
  149. //中文字符,如"中国人民abcd123"
  150. if (length <= 0)
  151. {
  152. return string.Empty;
  153. }
  154. byte[] bytesSource = Encoding.Default.GetBytes(sourceString);
  155. //当字符串长度大于起始位置
  156. if (bytesSource.Length > startIndex)
  157. {
  158. int endIndex = bytesSource.Length;
  159. //当要截取的长度在字符串的有效长度范围内
  160. if (bytesSource.Length > (startIndex + length))
  161. {
  162. endIndex = length + startIndex;
  163. }
  164. else
  165. { //当不在有效范围内时,只取到字符串的结尾
  166. length = bytesSource.Length - startIndex;
  167. tailString = "";
  168. }
  169. int[] anResultFlag = new int[length];
  170. int nFlag = 0;
  171. //字节大于127为双字节字符
  172. for (int i = startIndex; i < endIndex; i++)
  173. {
  174. if (bytesSource[i] > 127)
  175. {
  176. nFlag++;
  177. if (nFlag == 3)
  178. {
  179. nFlag = 1;
  180. }
  181. }
  182. else
  183. {
  184. nFlag = 0;
  185. }
  186. anResultFlag[i] = nFlag;
  187. }
  188. //最后一个字节为双字节字符的一半
  189. if ((bytesSource[endIndex - 1] > 127) && (anResultFlag[length - 1] == 1))
  190. {
  191. length = length + 1;
  192. }
  193. byte[] bsResult = new byte[length];
  194. Array.Copy(bytesSource, startIndex, bsResult, 0, length);
  195. myResult = Encoding.Default.GetString(bsResult);
  196. myResult = myResult + tailString;
  197. return myResult;
  198. }
  199. return string.Empty;
  200. }
  201. /// <summary>
  202. /// 加密文件流
  203. /// </summary>
  204. /// <param name="fs"></param>
  205. /// <returns></returns>
  206. public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey)
  207. {
  208. decryptKey = GetSubString(decryptKey, 32, "");
  209. decryptKey = decryptKey.PadRight(32, ' ');
  210. RijndaelManaged rijndaelProvider = new RijndaelManaged();
  211. rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
  212. rijndaelProvider.IV = Keys;
  213. ICryptoTransform encrypto = rijndaelProvider.CreateEncryptor();
  214. CryptoStream cytptostreamEncr = new CryptoStream(fs, encrypto, CryptoStreamMode.Write);
  215. return cytptostreamEncr;
  216. }
  217. /// <summary>
  218. /// 解密文件流
  219. /// </summary>
  220. /// <param name="fs"></param>
  221. /// <returns></returns>
  222. public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey)
  223. {
  224. decryptKey = GetSubString(decryptKey, 32, "");
  225. decryptKey = decryptKey.PadRight(32, ' ');
  226. RijndaelManaged rijndaelProvider = new RijndaelManaged();
  227. rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
  228. rijndaelProvider.IV = Keys;
  229. ICryptoTransform Decrypto = rijndaelProvider.CreateDecryptor();
  230. CryptoStream cytptostreamDecr = new CryptoStream(fs, Decrypto, CryptoStreamMode.Read);
  231. return cytptostreamDecr;
  232. }
  233. /// <summary>
  234. /// 对指定文件加密
  235. /// </summary>
  236. /// <param name="InputFile"></param>
  237. /// <param name="OutputFile"></param>
  238. /// <returns></returns>
  239. public static bool AES_EncryptFile(string InputFile, string OutputFile)
  240. {
  241. try
  242. {
  243. string decryptKey = "www.iqidi.com";
  244. FileStream fr = new FileStream(InputFile, FileMode.Open);
  245. FileStream fren = new FileStream(OutputFile, FileMode.Create);
  246. CryptoStream Enfr = AES_EncryptStrream(fren, decryptKey);
  247. byte[] bytearrayinput = new byte[fr.Length];
  248. fr.Read(bytearrayinput, 0, bytearrayinput.Length);
  249. Enfr.Write(bytearrayinput, 0, bytearrayinput.Length);
  250. Enfr.Close();
  251. fr.Close();
  252. fren.Close();
  253. }
  254. catch
  255. {
  256. //文件异常
  257. return false;
  258. }
  259. return true;
  260. }
  261. /// <summary>
  262. /// 对指定的文件解压缩
  263. /// </summary>
  264. /// <param name="InputFile"></param>
  265. /// <param name="OutputFile"></param>
  266. /// <returns></returns>
  267. public static bool AES_DecryptFile(string InputFile, string OutputFile)
  268. {
  269. try
  270. {
  271. string decryptKey = "www.iqidi.com";
  272. FileStream fr = new FileStream(InputFile, FileMode.Open);
  273. FileStream frde = new FileStream(OutputFile, FileMode.Create);
  274. CryptoStream Defr = AES_DecryptStream(fr, decryptKey);
  275. byte[] bytearrayoutput = new byte[1024];
  276. int m_count = 0;
  277. do
  278. {
  279. m_count = Defr.Read(bytearrayoutput, 0, bytearrayoutput.Length);
  280. frde.Write(bytearrayoutput, 0, m_count);
  281. if (m_count < bytearrayoutput.Length)
  282. break;
  283. } while (true);
  284. Defr.Close();
  285. fr.Close();
  286. frde.Close();
  287. }
  288. catch
  289. {
  290. //文件异常
  291. return false;
  292. }
  293. return true;
  294. }
  295. #endregion
  296. }
  297. }