DESProvider.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using System;
  2. using System.Text;
  3. using System.Security.Cryptography;
  4. using System.IO;
  5. namespace Ant.Service.Common
  6. {
  7. /// <summary>
  8. /// DES算法加密解密
  9. /// </summary>
  10. public class DESProvider
  11. {
  12. private DESProvider()
  13. {
  14. }
  15. //默认的初始化密钥
  16. private static string key = "netskycn";
  17. /// <summary>
  18. /// 对称加密解密的密钥
  19. /// </summary>
  20. public static string Key
  21. {
  22. get
  23. {
  24. return key;
  25. }
  26. set
  27. {
  28. key = value;
  29. }
  30. }
  31. #region 加密
  32. /// <summary>
  33. /// 采用DES算法对字符串加密
  34. /// </summary>
  35. /// <param name="encryptString">要加密的字符串</param>
  36. /// <param name="key">加密的密钥</param>
  37. /// <returns></returns>
  38. public static string EncryptString(string encryptString, string key)
  39. {
  40. //加密加密字符串是否为空
  41. if (string.IsNullOrEmpty(encryptString))
  42. {
  43. throw new ArgumentNullException("encryptString", "不能为空");
  44. }
  45. //加查密钥是否为空
  46. if (string.IsNullOrEmpty(key))
  47. {
  48. throw new ArgumentNullException("key", "不能为空");
  49. }
  50. //将密钥转换成字节数组
  51. byte[] keyBytes = Encoding.UTF8.GetBytes(key);
  52. //设置初始化向量
  53. byte[] keyIV = keyBytes;
  54. //将加密字符串转换成UTF8编码的字节数组
  55. byte[] inputByteArray = Encoding.UTF8.GetBytes(encryptString);
  56. //调用EncryptBytes方法加密
  57. byte[] resultByteArray = EncryptBytes(inputByteArray, keyBytes, keyIV);
  58. //将字节数组转换成字符串并返回
  59. return Convert.ToBase64String(resultByteArray);
  60. }
  61. /// <summary>
  62. /// DES加密
  63. /// </summary>
  64. /// <param name="encryptString">要加密的字符串</param>
  65. /// <returns></returns>
  66. public static string EncryptString(string encryptString)
  67. {
  68. return EncryptString(encryptString, key);
  69. }
  70. /// <summary>
  71. /// 采用DES算法对字节数组加密
  72. /// </summary>
  73. /// <param name="sourceBytes">要加密的字节数组</param>
  74. /// <param name="keyBytes">算法的密钥,长度为8的倍数,最大长度64</param>
  75. /// <param name="keyIV">算法的初始化向量,长度为8的倍数,最大长度64</param>
  76. /// <returns></returns>
  77. public static byte[] EncryptBytes(byte[] sourceBytes, byte[] keyBytes, byte[] keyIV)
  78. {
  79. if (sourceBytes == null || keyBytes == null || keyIV == null)
  80. {
  81. throw new ArgumentNullException("sourceBytes和keyBytes", "不能为空。");
  82. }
  83. else
  84. {
  85. //检查密钥数组长度是否是8的倍数并且长度是否小于64
  86. keyBytes = CheckByteArrayLength(keyBytes);
  87. //检查初始化向量数组长度是否是8的倍数并且长度是否小于64
  88. keyIV = CheckByteArrayLength(keyIV);
  89. DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  90. //实例化内存流MemoryStream
  91. MemoryStream mStream = new MemoryStream();
  92. //实例化CryptoStream
  93. CryptoStream cStream = new CryptoStream(mStream, provider.CreateEncryptor(keyBytes, keyIV), CryptoStreamMode.Write);
  94. cStream.Write(sourceBytes, 0, sourceBytes.Length);
  95. cStream.FlushFinalBlock();
  96. //将内存流转换成字节数组
  97. byte[] buffer = mStream.ToArray();
  98. mStream.Close();//关闭流
  99. cStream.Close();//关闭流
  100. return buffer;
  101. }
  102. }
  103. #endregion
  104. #region 解密
  105. public static string DecryptString(string decryptString, string key)
  106. {
  107. if (string.IsNullOrEmpty(decryptString))
  108. {
  109. throw new ArgumentNullException("decryptString", "不能为空");
  110. }
  111. if (string.IsNullOrEmpty(key))
  112. {
  113. throw new ArgumentNullException("key", "不能为空");
  114. }
  115. byte[] keyBytes = Encoding.UTF8.GetBytes(key);
  116. byte[] keyIV = keyBytes;
  117. //将解密字符串转换成Base64编码字节数组
  118. byte[] inputByteArray = Convert.FromBase64String(decryptString);
  119. //调用DecryptBytes方法解密
  120. byte[] resultByteArray = DecryptBytes(inputByteArray, keyBytes, keyIV);
  121. //将字节数组转换成UTF8编码的字符串
  122. return Encoding.UTF8.GetString(resultByteArray);
  123. }
  124. /// <summary>
  125. /// DES解密
  126. /// </summary>
  127. /// <param name="decryptString">要解密的字符串</param>
  128. /// <returns></returns>
  129. public static string DecryptString(string decryptString)
  130. {
  131. return DecryptString(decryptString, key);
  132. }
  133. /// <summary>
  134. /// 采用DES算法对字节数组解密
  135. /// </summary>
  136. /// <param name="sourceBytes">要加密的字节数组</param>
  137. /// <param name="keyBytes">算法的密钥,长度为8的倍数,最大长度64</param>
  138. /// <param name="keyIV">算法的初始化向量,长度为8的倍数,最大长度64</param>
  139. /// <returns></returns>
  140. public static byte[] DecryptBytes(byte[] sourceBytes, byte[] keyBytes, byte[] keyIV)
  141. {
  142. if (sourceBytes == null || keyBytes == null || keyIV == null)
  143. {
  144. throw new ArgumentNullException("soureBytes和keyBytes及keyIV", "不能为空。");
  145. }
  146. else
  147. {
  148. //检查密钥数组长度是否是8的倍数并且长度是否小于64
  149. keyBytes = CheckByteArrayLength(keyBytes);
  150. //检查初始化向量数组长度是否是8的倍数并且长度是否小于64
  151. keyIV = CheckByteArrayLength(keyIV);
  152. DESCryptoServiceProvider provider = new DESCryptoServiceProvider();
  153. MemoryStream mStream = new MemoryStream();
  154. CryptoStream cStream = new CryptoStream(mStream, provider.CreateDecryptor(keyBytes, keyIV), CryptoStreamMode.Write);
  155. cStream.Write(sourceBytes, 0, sourceBytes.Length);
  156. cStream.FlushFinalBlock();
  157. //将内存流转换成字节数组
  158. byte[] buffer = mStream.ToArray();
  159. mStream.Close();//关闭流
  160. cStream.Close();//关闭流
  161. return buffer;
  162. }
  163. }
  164. #endregion
  165. /// <summary>
  166. /// 检查密钥或初始化向量的长度,如果不是8的倍数或长度大于64则截取前8个元素
  167. /// </summary>
  168. /// <param name="byteArray">要检查的数组</param>
  169. /// <returns></returns>
  170. private static byte[] CheckByteArrayLength(byte[] byteArray)
  171. {
  172. byte[] resultBytes = new byte[8];
  173. //如果数组长度小于8
  174. if (byteArray.Length < 8)
  175. {
  176. return Encoding.UTF8.GetBytes("12345678");
  177. }
  178. //如果数组长度不是8的倍数
  179. else if (byteArray.Length % 8 != 0 || byteArray.Length > 64)
  180. {
  181. Array.Copy(byteArray, 0, resultBytes, 0, 8);
  182. return resultBytes;
  183. }
  184. else
  185. {
  186. return byteArray;
  187. }
  188. }
  189. }
  190. }