AES.cs 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  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. using ZLPlugin_MR.Domain.Units;
  9. namespace ZLPlugin_MR.Domain.Encript
  10. {
  11. internal class AES
  12. {
  13. /// <summary>
  14. /// AES解密
  15. /// </summary>
  16. /// <param name="str">解密报文内容</param>
  17. /// <param name="key">加密密钥</param>
  18. /// <param name="reval">解密结果</param>
  19. /// <returns>是否成功</returns>
  20. public bool Decrypt(string str, string key, ref string reval)
  21. {
  22. try
  23. {
  24. var _keyByte = Encoding.UTF8.GetBytes(key);
  25. var _valueByte = Convert.FromBase64String(str);
  26. using (var aes = new RijndaelManaged())
  27. {
  28. //aes.IV = !string.IsNullOrEmpty(iv) ? Convert.FromBase64String(iv) : Convert.FromBase64String(key);
  29. aes.IV = Encoding.UTF8.GetBytes(key);
  30. aes.BlockSize = 128;
  31. aes.KeySize = 128;
  32. aes.Key = _keyByte;
  33. aes.Mode = CipherMode.CBC;
  34. aes.Padding = PaddingMode.PKCS7;
  35. var cryptoTransform = aes.CreateDecryptor();
  36. var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
  37. reval = Encoding.UTF8.GetString(resultArray);
  38. return true;
  39. }
  40. }
  41. catch (Exception ex) { Log.Info(ex.Message); reval = ex.Message; return false; }
  42. }
  43. /// <summary>
  44. /// AES加密
  45. /// </summary>
  46. /// <param name="str">加密报文内容</param>
  47. /// <param name="key">加密密钥</param>
  48. /// <param name="reval">加密结果</param>
  49. /// <returns>是否成功</returns>
  50. public bool Encrypt(string str, string key, ref string reval)
  51. {
  52. try
  53. {
  54. var _keyByte = Encoding.UTF8.GetBytes(key);
  55. var _valueByte = Encoding.UTF8.GetBytes(str);
  56. using (var aes = new RijndaelManaged())
  57. {
  58. //aes.IV = !string.IsNullOrEmpty(iv) ? Convert.FromBase64String(iv) : Convert.FromBase64String(key);
  59. aes.IV = Encoding.UTF8.GetBytes(key);
  60. aes.BlockSize = 128;
  61. aes.KeySize = 128;
  62. aes.Key = _keyByte;
  63. aes.Mode = CipherMode.CBC;
  64. aes.Padding = PaddingMode.PKCS7;
  65. var cryptoTransform = aes.CreateEncryptor();
  66. var resultArray = cryptoTransform.TransformFinalBlock(_valueByte, 0, _valueByte.Length);
  67. reval = Convert.ToBase64String(resultArray);
  68. return true;
  69. }
  70. }
  71. catch (Exception ex) { Log.Info(ex.Message); reval = ex.Message; return false; }
  72. }
  73. /// <summary>
  74. /// AES解密
  75. /// </summary>
  76. /// <param name="Data">被解密的密文</param>
  77. /// <param name="Key">密钥</param>
  78. /// <param name="Vector">向量</param>
  79. /// <returns>明文</returns>
  80. public static String AESDecrypt(String Data, String Key, String Vector, String mode = "ECB", String padding = "PKCS7")
  81. {
  82. if (string.IsNullOrEmpty(Vector))
  83. Vector = Key;
  84. //yte[] encryptedBytes = Encoding.UTF8.GetBytes(Data);
  85. Byte[] encryptedBytes = Convert.FromBase64String(Data);
  86. Byte[] bKey = new Byte[32];
  87. Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
  88. Byte[] bVector = new Byte[16];
  89. Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
  90. Byte[] original = null; // 解密后的明文​
  91. Rijndael Aes = Rijndael.Create();
  92. switch (mode.ToUpper())
  93. {
  94. case "CBC": Aes.Mode = CipherMode.CBC; break;
  95. case "CFB": Aes.Mode = CipherMode.CFB; break;
  96. case "CTS": Aes.Mode = CipherMode.CTS; break;
  97. case "ECB": Aes.Mode = CipherMode.ECB; break;
  98. case "OFB": Aes.Mode = CipherMode.OFB; break;
  99. default: Aes.Mode = CipherMode.CBC; break;
  100. }
  101. switch (padding.ToUpper())
  102. {
  103. case "PKCS7": Aes.Padding = PaddingMode.PKCS7; break;
  104. case "NONE": Aes.Padding = PaddingMode.None; break;
  105. case "ANSIX923": Aes.Padding = PaddingMode.ANSIX923; break;
  106. case "ISO10126": Aes.Padding = PaddingMode.ISO10126; break;
  107. case "ZEROS": Aes.Padding = PaddingMode.Zeros; break;
  108. default: Aes.Padding = PaddingMode.PKCS7; break;
  109. }
  110. try
  111. {
  112. // 开辟一块内存流,存储密文
  113. using (MemoryStream Memory = new MemoryStream(encryptedBytes))
  114. {
  115. // 把内存流对象包装成加密流对象
  116. using (CryptoStream Decryptor = new CryptoStream(Memory,
  117. Aes.CreateDecryptor(bKey, bVector),
  118. CryptoStreamMode.Read))
  119. {
  120. // 明文存储区
  121. using (MemoryStream originalMemory = new MemoryStream())
  122. {
  123. Byte[] Buffer = new Byte[1024];
  124. Int32 readBytes = 0;
  125. while ((readBytes = Decryptor.Read(Buffer, 0, Buffer.Length)) > 0)
  126. {
  127. originalMemory.Write(Buffer, 0, readBytes);
  128. }
  129. original = originalMemory.ToArray();
  130. }
  131. }
  132. }
  133. }
  134. catch (Exception ex)
  135. {
  136. Log.Info(ex.Message);
  137. return ex.Message;
  138. }
  139. return Encoding.UTF8.GetString(original);
  140. }
  141. /// <summary>
  142. /// AES加密
  143. /// </summary>
  144. /// <param name="Data">被加密的明文</param>
  145. /// <param name="Key">密钥</param>
  146. /// <param name="Vector">向量</param>
  147. /// <returns>密文</returns>
  148. public static String AESEncrypt(String Data, String Key, String Vector, String mode = "ECB", String padding = "PKCS7")
  149. {
  150. if (string.IsNullOrEmpty(Vector))
  151. Vector = Key;
  152. Byte[] plainBytes = Encoding.UTF8.GetBytes(Data);
  153. Byte[] bKey = new Byte[32];
  154. Array.Copy(Encoding.UTF8.GetBytes(Key.PadRight(bKey.Length)), bKey, bKey.Length);
  155. Byte[] bVector = new Byte[16];
  156. Array.Copy(Encoding.UTF8.GetBytes(Vector.PadRight(bVector.Length)), bVector, bVector.Length);
  157. Byte[] Cryptograph = null; // 加密后的密文
  158. Rijndael Aes = Rijndael.Create();
  159. switch (mode.ToUpper())
  160. {
  161. case "CBC": Aes.Mode = CipherMode.CBC; break;
  162. case "CFB": Aes.Mode = CipherMode.CFB; break;
  163. case "CTS": Aes.Mode = CipherMode.CTS; break;
  164. case "ECB": Aes.Mode = CipherMode.ECB; break;
  165. case "OFB": Aes.Mode = CipherMode.OFB; break;
  166. default: Aes.Mode = CipherMode.CBC; break;
  167. }
  168. switch (padding.ToUpper())
  169. {
  170. case "PKCS7": Aes.Padding = PaddingMode.PKCS7; break;
  171. case "NONE": Aes.Padding = PaddingMode.None; break;
  172. case "ANSIX923": Aes.Padding = PaddingMode.ANSIX923; break;
  173. case "ISO10126": Aes.Padding = PaddingMode.ISO10126; break;
  174. case "ZEROS": Aes.Padding = PaddingMode.Zeros; break;
  175. default: Aes.Padding = PaddingMode.PKCS7; break;
  176. }
  177. try
  178. {
  179. // 开辟一块内存流
  180. using (MemoryStream Memory = new MemoryStream())
  181. {
  182. // 把内存流对象包装成加密流对象
  183. using (CryptoStream Encryptor = new CryptoStream(Memory,
  184. Aes.CreateEncryptor(bKey, bVector),
  185. CryptoStreamMode.Write))
  186. {
  187. // 明文数据写入加密流
  188. Encryptor.Write(plainBytes, 0, plainBytes.Length);
  189. Encryptor.FlushFinalBlock();
  190. Cryptograph = Memory.ToArray();
  191. }
  192. }
  193. }
  194. catch (Exception ex)
  195. {
  196. Log.Info(ex.Message);
  197. return ex.Message;
  198. }
  199. return Convert.ToBase64String(Cryptograph);
  200. //return Encoding.UTF8.GetString(Cryptograph);
  201. }
  202. }
  203. }