1 #region
2
3 using System;
4 using System.IO;
5 using System.Security.Cryptography;
6 using System.Text;
7
8 #endregion
9
10 namespace Wen.Helpers.Common
11 {
12 /// <summary>
13 /// 安全助手
14 /// </summary>
15 public sealed class SecurityHelper
16 {
17 private static readonly byte[] IvBytes = {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF};
18
19 #region 通用加密算法
20
21 /// <summary>
22 /// 哈希加密算法
23 /// </summary>
24 /// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param>
25 /// <param name="input"> 待加密的字符串 </param>
26 /// <param name="encoding"> 字符编码 </param>
27 /// <returns></returns>
28 private static string HashEncrypt(HashAlgorithm hashAlgorithm, string input, Encoding encoding)
29 {
30 var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input));
31
32 return BitConverter.ToString(data).Replace("-", "");
33 }
34
35 /// <summary>
36 /// 验证哈希值
37 /// </summary>
38 /// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param>
39 /// <param name="unhashedText"> 未加密的字符串 </param>
40 /// <param name="hashedText"> 经过加密的哈希值 </param>
41 /// <param name="encoding"> 字符编码 </param>
42 /// <returns></returns>
43 private static bool VerifyHashValue(HashAlgorithm hashAlgorithm, string unhashedText, string hashedText,
44 Encoding encoding)
45 {
46 return string.Equals(HashEncrypt(hashAlgorithm, unhashedText, encoding), hashedText,
47 StringComparison.OrdinalIgnoreCase);
48 }
49
50 #endregion 通用加密算法
51
52 #region 哈希加密算法
53
54 #region MD5 算法
55
56 /// <summary>
57 /// MD5 加密
58 /// </summary>
59 /// <param name="input"> 待加密的字符串 </param>
60 /// <param name="encoding"> 字符编码 </param>
61 /// <returns></returns>
62 public static string Md5Encrypt(string input, Encoding encoding)
63 {
64 return HashEncrypt(MD5.Create(), input, encoding);
65 }
66
67 /// <summary>
68 /// 验证 MD5 值
69 /// </summary>
70 /// <param name="input"> 未加密的字符串 </param>
71 /// <param name="encoding"> 字符编码 </param>
72 /// <returns></returns>
73 public static bool VerifyMd5Value(string input, Encoding encoding)
74 {
75 return VerifyHashValue(MD5.Create(), input, Md5Encrypt(input, encoding), encoding);
76 }
77
78 #endregion MD5 算法
79
80 #region SHA1 算法
81
82 /// <summary>
83 /// SHA1 加密
84 /// </summary>
85 /// <param name="input"> 要加密的字符串 </param>
86 /// <param name="encoding"> 字符编码 </param>
87 /// <returns></returns>
88 public static string Sha1Encrypt(string input, Encoding encoding)
89 {
90 return HashEncrypt(SHA1.Create(), input, encoding);
91 }
92
93 /// <summary>
94 /// 验证 SHA1 值
95 /// </summary>
96 /// <param name="input"> 未加密的字符串 </param>
97 /// <param name="encoding"> 字符编码 </param>
98 /// <returns></returns>
99 public static bool VerifySha1Value(string input, Encoding encoding)
100 {
101 return VerifyHashValue(SHA1.Create(), input, Sha1Encrypt(input, encoding), encoding);
102 }
103
104 #endregion SHA1 算法
105
106 #region SHA256 算法
107
108 /// <summary>
109 /// SHA256 加密
110 /// </summary>
111 /// <param name="input"> 要加密的字符串 </param>
112 /// <param name="encoding"> 字符编码 </param>
113 /// <returns></returns>
114 public static string Sha256Encrypt(string input, Encoding encoding)
115 {
116 return HashEncrypt(SHA256.Create(), input, encoding);
117 }
118
119 /// <summary>
120 /// 验证 SHA256 值
121 /// </summary>
122 /// <param name="input"> 未加密的字符串 </param>
123 /// <param name="encoding"> 字符编码 </param>
124 /// <returns></returns>
125 public static bool VerifySha256Value(string input, Encoding encoding)
126 {
127 return VerifyHashValue(SHA256.Create(), input, Sha256Encrypt(input, encoding), encoding);
128 }
129
130 #endregion SHA256 算法
131
132 #region SHA384 算法
133
134 /// <summary>
135 /// SHA384 加密
136 /// </summary>
137 /// <param name="input"> 要加密的字符串 </param>
138 /// <param name="encoding"> 字符编码 </param>
139 /// <returns></returns>
140 public static string Sha384Encrypt(string input, Encoding encoding)
141 {
142 return HashEncrypt(SHA384.Create(), input, encoding);
143 }
144
145 /// <summary>
146 /// 验证 SHA384 值
147 /// </summary>
148 /// <param name="input"> 未加密的字符串 </param>
149 /// <param name="encoding"> 字符编码 </param>
150 /// <returns></returns>
151 public static bool VerifySha384Value(string input, Encoding encoding)
152 {
153 return VerifyHashValue(SHA256.Create(), input, Sha384Encrypt(input, encoding), encoding);
154 }
155
156 #endregion SHA384 算法
157
158 #region SHA512 算法
159
160 /// <summary>
161 /// SHA512 加密
162 /// </summary>
163 /// <param name="input"> 要加密的字符串 </param>
164 /// <param name="encoding"> 字符编码 </param>
165 /// <returns></returns>
166 public static string Sha512Encrypt(string input, Encoding encoding)
167 {
168 return HashEncrypt(SHA512.Create(), input, encoding);
169 }
170
171 /// <summary>
172 /// 验证 SHA512 值
173 /// </summary>
174 /// <param name="input"> 未加密的字符串 </param>
175 /// <param name="encoding"> 字符编码 </param>
176 /// <returns></returns>
177 public static bool VerifySha512Value(string input, Encoding encoding)
178 {
179 return VerifyHashValue(SHA512.Create(), input, Sha512Encrypt(input, encoding), encoding);
180 }
181
182 #endregion SHA512 算法
183
184 #region HMAC-MD5 加密
185
186 /// <summary>
187 /// HMAC-MD5 加密
188 /// </summary>
189 /// <param name="input"> 要加密的字符串 </param>
190 /// <param name="key"> 密钥 </param>
191 /// <param name="encoding"> 字符编码 </param>
192 /// <returns></returns>
193 public static string HmacMd5Encrypt(string input, string key, Encoding encoding)
194 {
195 return HashEncrypt(new HMACMD5(encoding.GetBytes(key)), input, encoding);
196 }
197
198 #endregion HMAC-MD5 加密
199
200 #region HMAC-SHA1 加密
201
202 /// <summary>
203 /// HMAC-SHA1 加密
204 /// </summary>
205 /// <param name="input"> 要加密的字符串 </param>
206 /// <param name="key"> 密钥 </param>
207 /// <param name="encoding"> 字符编码 </param>
208 /// <returns></returns>
209 public static string HmacSha1Encrypt(string input, string key, Encoding encoding)
210 {
211 return HashEncrypt(new HMACSHA1(encoding.GetBytes(key)), input, encoding);
212 }
213
214 #endregion HMAC-SHA1 加密
215
216 #region HMAC-SHA256 加密
217
218 /// <summary>
219 /// HMAC-SHA256 加密
220 /// </summary>
221 /// <param name="input"> 要加密的字符串 </param>
222 /// <param name="key"> 密钥 </param>
223 /// <param name="encoding"> 字符编码 </param>
224 /// <returns></returns>
225 public static string HmacSha256Encrypt(string input, string key, Encoding encoding)
226 {
227 return HashEncrypt(new HMACSHA256(encoding.GetBytes(key)), input, encoding);
228 }
229
230 #endregion HMAC-SHA256 加密
231
232 #region HMAC-SHA384 加密
233
234 /// <summary>
235 /// HMAC-SHA384 加密
236 /// </summary>
237 /// <param name="input"> 要加密的字符串 </param>
238 /// <param name="key"> 密钥 </param>
239 /// <param name="encoding"> 字符编码 </param>
240 /// <returns></returns>
241 public static string HmacSha384Encrypt(string input, string key, Encoding encoding)
242 {
243 return HashEncrypt(new HMACSHA384(encoding.GetBytes(key)), input, encoding);
244 }
245
246 #endregion HMAC-SHA384 加密
247
248 #region HMAC-SHA512 加密
249
250 /// <summary>
251 /// HMAC-SHA512 加密
252 /// </summary>
253 /// <param name="input"> 要加密的字符串 </param>
254 /// <param name="key"> 密钥 </param>
255 /// <param name="encoding"> 字符编码 </param>
256 /// <returns></returns>
257 public static string HmacSha512Encrypt(string input, string key, Encoding encoding)
258 {
259 return HashEncrypt(new HMACSHA512(encoding.GetBytes(key)), input, encoding);
260 }
261
262 #endregion HMAC-SHA512 加密
263
264 #endregion 哈希加密算法
265
266 #region 对称加密算法
267
268 #region Des 加解密
269
270 /// <summary>
271 /// DES 加密
272 /// </summary>
273 /// <param name="input"> 待加密的字符串 </param>
274 /// <param name="key"> 密钥(8位) </param>
275 /// <returns></returns>
276 public static string DesEncrypt(string input, string key)
277 {
278 try
279 {
280 var keyBytes = Encoding.UTF8.GetBytes(key);
281 //var ivBytes = Encoding.UTF8.GetBytes(iv);
282
283 var des = DES.Create();
284 des.Mode = CipherMode.ECB; //兼容其他语言的 Des 加密算法
285 des.Padding = PaddingMode.Zeros; //自动补 0
286
287 using (var ms = new MemoryStream())
288 {
289 var data = Encoding.UTF8.GetBytes(input);
290
291 using (var cs = new CryptoStream(ms, des.CreateEncryptor(keyBytes, IvBytes), CryptoStreamMode.Write)
292 )
293 {
294 cs.Write(data, 0, data.Length);
295 cs.FlushFinalBlock();
296 }
297
298 return Convert.ToBase64String(ms.ToArray());
299 }
300 }
301 catch
302 {
303 return input;
304 }
305 }
306
307 /// <summary>
308 /// DES 解密
309 /// </summary>
310 /// <param name="input"> 待解密的字符串 </param>
311 /// <param name="key"> 密钥(8位) </param>
312 /// <returns></returns>
313 public static string DesDecrypt(string input, string key)
314 {
315 try
316 {
317 var keyBytes = Encoding.UTF8.GetBytes(key);
318 //var ivBytes = Encoding.UTF8.GetBytes(iv);
319
320 var des = DES.Create();
321 des.Mode = CipherMode.ECB; //兼容其他语言的Des加密算法
322 des.Padding = PaddingMode.Zeros; //自动补0
323
324 using (var ms = new MemoryStream())
325 {
326 var data = Convert.FromBase64String(input);
327
328 using (var cs = new CryptoStream(ms, des.CreateDecryptor(keyBytes, IvBytes), CryptoStreamMode.Write)
329 )
330 {
331 cs.Write(data, 0, data.Length);
332
333 cs.FlushFinalBlock();
334 }
335
336 return Encoding.UTF8.GetString(ms.ToArray());
337 }
338 }
339 catch
340 {
341 return input;
342 }
343 }
344
345 #endregion Des 加解密
346
347 #endregion 对称加密算法
348
349 #region 非对称加密算法
350
351 /// <summary>
352 /// 生成 RSA 公钥和私钥
353 /// </summary>
354 /// <param name="publicKey"> 公钥 </param>
355 /// <param name="privateKey"> 私钥 </param>
356 public static void GenerateRsaKeys(out string publicKey, out string privateKey)
357 {
358 using (var rsa = new RSACryptoServiceProvider())
359 {
360 publicKey = rsa.ToXmlString(false);
361 privateKey = rsa.ToXmlString(true);
362 }
363 }
364
365 /// <summary>
366 /// RSA 加密
367 /// </summary>
368 /// <param name="publickey"> 公钥 </param>
369 /// <param name="content"> 待加密的内容 </param>
370 /// <returns> 经过加密的字符串 </returns>
371 public static string RsaEncrypt(string publickey, string content)
372 {
373 var rsa = new RSACryptoServiceProvider();
374 rsa.FromXmlString(publickey);
375 var cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false);
376
377 return Convert.ToBase64String(cipherbytes);
378 }
379
380 /// <summary>
381 /// RSA 解密
382 /// </summary>
383 /// <param name="privatekey"> 私钥 </param>
384 /// <param name="content"> 待解密的内容 </param>
385 /// <returns> 解密后的字符串 </returns>
386 public static string RsaDecrypt(string privatekey, string content)
387 {
388 var rsa = new RSACryptoServiceProvider();
389 rsa.FromXmlString(privatekey);
390 var cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false);
391
392 return Encoding.UTF8.GetString(cipherbytes);
393 }
394
395 #endregion 非对称加密算法
396 }
397 }