简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)

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

 

posted @ 2017-03-01 15:21  星火卓越  阅读(370)  评论(0编辑  收藏  举报