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