C# 加密大全

自己整理的常用加密方式。

  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.Web;
  8 
  9 namespace WebDemo.Until
 10 {
 11 
 12     public class EncryptHelper
 13     {
 14         #region DES对称加密解密
 15 
 16         /// <summary> 加密字符串
 17         /// </summary> 
 18         /// <param name="strText">需被加密的字符串</param> 
 19         /// <param name="strEncrKey">密钥</param> 
 20         /// <returns></returns> 
 21         public static string DesEncrypt(string strText, string strEncrKey)
 22         {
 23             try
 24             {
 25                 byte[] byKey = null;
 26                 byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
 27 
 28                 byKey = Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));
 29                 DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 30                 byte[] inputByteArray = Encoding.UTF8.GetBytes(strText);
 31                 MemoryStream ms = new MemoryStream();
 32                 CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
 33                 cs.Write(inputByteArray, 0, inputByteArray.Length);
 34                 cs.FlushFinalBlock();
 35                 return Convert.ToBase64String(ms.ToArray());
 36             }
 37             catch
 38             {
 39                 return "";
 40             }
 41         }
 42 
 43         /// <summary> 解密字符串
 44         /// </summary> 
 45         /// <param name="strText">需被解密的字符串</param> 
 46         /// <param name="sDecrKey">密钥</param> 
 47         /// <returns></returns> 
 48         public static string DesDecrypt(string strText, string sDecrKey)
 49         {
 50             try
 51             {
 52                 byte[] byKey = null;
 53                 byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
 54                 byte[] inputByteArray = new Byte[strText.Length];
 55 
 56                 byKey = Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));
 57                 DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 58                 inputByteArray = Convert.FromBase64String(strText);
 59                 MemoryStream ms = new MemoryStream();
 60                 CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
 61                 cs.Write(inputByteArray, 0, inputByteArray.Length);
 62                 cs.FlushFinalBlock();
 63                 Encoding encoding = new UTF8Encoding();
 64                 return encoding.GetString(ms.ToArray());
 65             }
 66             catch
 67             {
 68                 return null;
 69             }
 70         }
 71 
 72         /// <summary> 加密文件
 73         ///
 74         /// </summary> 
 75         /// <param name="m_InFilePath">原路径</param> 
 76         /// <param name="m_OutFilePath">加密后的文件路径</param> 
 77         /// <param name="strEncrKey">密钥</param> 
 78         public static void DesEncryptFile(string m_InFilePath, string m_OutFilePath, string strEncrKey)
 79         {
 80             try
 81             {
 82                 byte[] byKey = null;
 83                 byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
 84 
 85                 byKey = Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));
 86                 FileStream fin = new FileStream(m_InFilePath, FileMode.Open, FileAccess.Read);
 87                 FileStream fout = new FileStream(m_OutFilePath, FileMode.OpenOrCreate, FileAccess.Write);
 88                 fout.SetLength(0);
 89                 //Create variables to help with read and write. 
 90                 byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
 91                 long rdlen = 0; //This is the total number of bytes written. 
 92                 long totlen = fin.Length; //This is the total length of the input file. 
 93                 int len; //This is the number of bytes to be written at a time.
 94 
 95                 DES des = new DESCryptoServiceProvider();
 96                 CryptoStream encStream = new CryptoStream(fout, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
 97 
 98                 //Read from the input file, then encrypt and write to the output file. 
 99                 while (rdlen < totlen)
100                 {
101                     len = fin.Read(bin, 0, 100);
102                     encStream.Write(bin, 0, len);
103                     rdlen = rdlen + len;
104                 }
105                 encStream.Close();
106                 fout.Close();
107                 fin.Close();
108             }
109             catch
110             {
111             }
112 
113         }
114 
115         /// <summary> 解密文件
116         /// 
117         /// </summary> 
118         /// <param name="m_InFilePath">被解密路径</param> 
119         /// <param name="m_OutFilePath">解密后的路径</param> 
120         /// <param name="sDecrKey">密钥</param> 
121         public static void DesDecryptFile(string m_InFilePath, string m_OutFilePath, string sDecrKey)
122         {
123             try
124             {
125                 byte[] byKey = null;
126                 byte[] IV = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
127 
128                 byKey = Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));
129                 FileStream fin = new FileStream(m_InFilePath, FileMode.Open, FileAccess.Read);
130                 FileStream fout = new FileStream(m_OutFilePath, FileMode.OpenOrCreate, FileAccess.Write);
131                 fout.SetLength(0);
132                 //Create variables to help with read and write. 
133                 byte[] bin = new byte[100]; //This is intermediate storage for the encryption. 
134                 long rdlen = 0; //This is the total number of bytes written. 
135                 long totlen = fin.Length; //This is the total length of the input file. 
136                 int len; //This is the number of bytes to be written at a time.
137 
138                 DES des = new DESCryptoServiceProvider();
139                 CryptoStream encStream = new CryptoStream(fout, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
140 
141                 //Read from the input file, then encrypt and write to the output file. 
142                 while (rdlen < totlen)
143                 {
144                     len = fin.Read(bin, 0, 100);
145                     encStream.Write(bin, 0, len);
146                     rdlen = rdlen + len;
147                 }
148                 encStream.Close();
149                 fout.Close();
150                 fin.Close();
151             }
152             catch
153             {
154             }
155         }
156         #endregion
157 
158         #region 3DES对称加密解密
159         /// <summary>
160         ///3DES加密
161         /// </summary>
162         /// <param name="originalValue">加密数据</param>
163         /// <param name="key">24位字符的密钥字符串</param>
164         /// <param name="IV">8位字符的初始化向量字符串</param>
165         /// <returns></returns>
166         public static string DESEncrypt(string originalValue, string key, string IV)
167         {
168             SymmetricAlgorithm sa = new TripleDESCryptoServiceProvider();
169             sa.Mode = CipherMode.CBC;
170             sa.Padding = PaddingMode.PKCS7;
171             sa.Key = Encoding.UTF8.GetBytes(key);
172             sa.IV = Encoding.UTF8.GetBytes(IV);
173             ICryptoTransform ct = sa.CreateEncryptor();
174             byte[] byt = Encoding.UTF8.GetBytes(originalValue);
175             MemoryStream ms = new MemoryStream();
176             CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
177             cs.Write(byt, 0, byt.Length);
178             cs.FlushFinalBlock();
179             cs.Close();
180             return Convert.ToBase64String(ms.ToArray());
181         }
182         /// <summary>
183         /// 3DES解密
184         /// </summary>
185         /// <param name="data">解密数据</param>
186         /// <param name="key">24位字符的密钥字符串(需要和加密时相同)</param>
187         /// <param name="iv">8位字符的初始化向量字符串(需要和加密时相同)</param>
188         /// <returns></returns>
189         public static string DESDecrypst(string data, string key, string IV)
190         {
191             SymmetricAlgorithm mCSP = new TripleDESCryptoServiceProvider();
192             mCSP.Mode = CipherMode.CBC;
193             mCSP.Padding = PaddingMode.PKCS7;
194             mCSP.Key = Encoding.UTF8.GetBytes(key);
195             mCSP.IV = Encoding.UTF8.GetBytes(IV);
196             ICryptoTransform ct = mCSP.CreateDecryptor(mCSP.Key, mCSP.IV);
197             byte[] byt = Convert.FromBase64String(data);
198             MemoryStream ms = new MemoryStream();
199             CryptoStream cs = new CryptoStream(ms, ct, CryptoStreamMode.Write);
200             cs.Write(byt, 0, byt.Length);
201             cs.FlushFinalBlock();
202             cs.Close();
203             return Encoding.UTF8.GetString(ms.ToArray());
204         }
205         #endregion
206 
207         #region AES RijndaelManaged加密解密
208 
209         private static readonly string Default_AES_Key = "@#kim123";
210         private static byte[] Keys = { 0x41, 0x72, 0x65, 0x79, 0x6F, 0x75, 0x6D, 0x79,
211                                              0x53,0x6E, 0x6F, 0x77, 0x6D, 0x61, 0x6E, 0x3F };
212         public static string AES_Encrypt(string encryptString)
213         {
214             return AES_Encrypt(encryptString, Default_AES_Key);
215         }
216 
217         public static string AES_Decrypt(string decryptString)
218         {
219             return AES_Decrypt(decryptString, Default_AES_Key);
220         }
221 
222         #region AES(CBC)有向量(IV)
223         /// <summary>对称加密算法AES RijndaelManaged加密(RijndaelManaged(AES)算法是块式加密算法)
224         /// 
225         /// </summary>
226         /// <param name="encryptString">待加密字符串</param>
227         /// <param name="encryptKey">加密密钥,须半角字符</param>
228         /// <returns>加密结果字符串</returns>
229         public static string AES_Encrypt(string encryptString, string encryptKey)
230         {
231             encryptKey = GetSubString(encryptKey, 32, "");
232             encryptKey = encryptKey.PadRight(32, ' ');
233 
234             RijndaelManaged rijndaelProvider = new RijndaelManaged();
235             rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32));
236             rijndaelProvider.IV = Keys;
237             ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
238 
239             byte[] inputData = Encoding.UTF8.GetBytes(encryptString);
240             byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);
241 
242             return Convert.ToBase64String(encryptedData);
243         }
244 
245         /// <summary> 对称加密算法AES RijndaelManaged解密字符串
246         ///
247         /// </summary>
248         /// <param name="decryptString">待解密的字符串</param>
249         /// <param name="decryptKey">解密密钥,和加密密钥相同</param>
250         /// <returns>解密成功返回解密后的字符串,失败返回空</returns>
251         public static string AES_Decrypt(string decryptString, string decryptKey)
252         {
253             try
254             {
255                 decryptKey = GetSubString(decryptKey, 32, "");
256                 decryptKey = decryptKey.PadRight(32, ' ');
257 
258                 RijndaelManaged rijndaelProvider = new RijndaelManaged();
259                 rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
260                 rijndaelProvider.IV = Keys;
261                 ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
262 
263                 byte[] inputData = Convert.FromBase64String(decryptString);
264                 byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
265 
266                 return Encoding.UTF8.GetString(decryptedData);
267             }
268             catch
269             {
270                 return string.Empty;
271             }
272         }
273         #endregion
274 
275         #region AES(ECB)无向量(IV)
276         /// <summary>  
277         /// AES加密(无向量)  
278         /// </summary>  
279         /// <param name="plainBytes">被加密的明文</param>  
280         /// <param name="key">密钥 32 </param>  
281         /// <returns>密文</returns>  
282         public static string AESEncryptECB(string encryptString, string encryptKey)
283         {
284             try
285             {
286                 encryptKey = GetSubString(encryptKey, 32, "");
287                 encryptKey = encryptKey.PadRight(32, ' ');
288 
289                 RijndaelManaged rijndaelProvider = new RijndaelManaged();
290                 rijndaelProvider.Key = Encoding.UTF8.GetBytes(encryptKey.Substring(0, 32));
291                 rijndaelProvider.Mode = CipherMode.ECB;
292                 rijndaelProvider.Padding = PaddingMode.PKCS7;
293                 ICryptoTransform rijndaelEncrypt = rijndaelProvider.CreateEncryptor();
294                 byte[] inputData = Encoding.UTF8.GetBytes(encryptString);
295                 byte[] encryptedData = rijndaelEncrypt.TransformFinalBlock(inputData, 0, inputData.Length);
296                 return Convert.ToBase64String(encryptedData);
297             }
298             catch (Exception ex)
299             {
300                 return ex.Message;
301             }
302         }
303 
304 
305         /// <summary>  
306         /// AES解密(无向量)  
307         /// </summary>  
308         /// <param name="decryptString">被加密的明文</param>  
309         /// <param name="decryptKey">密钥</param>  
310         /// <returns>明文</returns>  
311         public static string AESDecryptECB(string decryptString, string decryptKey)
312         {
313             try
314             {
315                 decryptKey = GetSubString(decryptKey, 32, "");
316                 decryptKey = decryptKey.PadRight(32, ' ');
317 
318                 RijndaelManaged rijndaelProvider = new RijndaelManaged();
319                 rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey.Substring(0, 32));
320                 rijndaelProvider.Mode = CipherMode.ECB;
321                 rijndaelProvider.Padding = PaddingMode.PKCS7;
322                 ICryptoTransform rijndaelDecrypt = rijndaelProvider.CreateDecryptor();
323                 byte[] inputData = Convert.FromBase64String(decryptString);
324                 byte[] decryptedData = rijndaelDecrypt.TransformFinalBlock(inputData, 0, inputData.Length);
325                 return Encoding.UTF8.GetString(decryptedData);
326             }
327             catch (Exception ex)
328             {
329                 return ex.Message;
330             }
331         }
332         #endregion
333 
334 
335         /// <summary>
336         /// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分
337         /// </summary>
338         /// <param name="sourceString">源字符串</param>
339         /// <param name="length">所取字符串字节长度</param>
340         /// <param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")</param>
341         /// <returns>某字符串的一部分</returns>
342         private static string GetSubString(string sourceString, int length, string tailString)
343         {
344             return GetSubString(sourceString, 0, length, tailString);
345         }
346 
347         /// <summary>
348         /// 按字节长度(按字节,一个汉字为2个字节)取得某字符串的一部分
349         /// </summary>
350         /// <param name="sourceString">源字符串</param>
351         /// <param name="startIndex">索引位置,以0开始</param>
352         /// <param name="length">所取字符串字节长度</param>
353         /// <param name="tailString">附加字符串(当字符串不够长时,尾部所添加的字符串,一般为"...")</param>
354         /// <returns>某字符串的一部分</returns>
355         private static string GetSubString(string sourceString, int startIndex, int length, string tailString)
356         {
357             string myResult = sourceString;
358 
359             //当是日文或韩文时(注:中文的范围:\u4e00 - \u9fa5, 日文在\u0800 - \u4e00, 韩文为\xAC00-\xD7A3)
360             if (System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\u0800-\u4e00]+") ||
361                 System.Text.RegularExpressions.Regex.IsMatch(sourceString, "[\xAC00-\xD7A3]+"))
362             {
363                 //当截取的起始位置超出字段串长度时
364                 if (startIndex >= sourceString.Length)
365                 {
366                     return string.Empty;
367                 }
368                 else
369                 {
370                     return sourceString.Substring(startIndex,
371                                                    ((length + startIndex) > sourceString.Length) ? (sourceString.Length - startIndex) : length);
372                 }
373             }
374 
375             //中文字符,如"中国人民abcd123"
376             if (length <= 0)
377             {
378                 return string.Empty;
379             }
380             byte[] bytesSource = Encoding.Default.GetBytes(sourceString);
381 
382             //当字符串长度大于起始位置
383             if (bytesSource.Length > startIndex)
384             {
385                 int endIndex = bytesSource.Length;
386 
387                 //当要截取的长度在字符串的有效长度范围内
388                 if (bytesSource.Length > (startIndex + length))
389                 {
390                     endIndex = length + startIndex;
391                 }
392                 else
393                 {   //当不在有效范围内时,只取到字符串的结尾
394                     length = bytesSource.Length - startIndex;
395                     tailString = "";
396                 }
397 
398                 int[] anResultFlag = new int[length];
399                 int nFlag = 0;
400                 //字节大于127为双字节字符
401                 for (int i = startIndex; i < endIndex; i++)
402                 {
403                     if (bytesSource[i] > 127)
404                     {
405                         nFlag++;
406                         if (nFlag == 3)
407                         {
408                             nFlag = 1;
409                         }
410                     }
411                     else
412                     {
413                         nFlag = 0;
414                     }
415                     anResultFlag[i] = nFlag;
416                 }
417                 //最后一个字节为双字节字符的一半
418                 if ((bytesSource[endIndex - 1] > 127) && (anResultFlag[length - 1] == 1))
419                 {
420                     length = length + 1;
421                 }
422 
423                 byte[] bsResult = new byte[length];
424                 Array.Copy(bytesSource, startIndex, bsResult, 0, length);
425                 myResult = Encoding.Default.GetString(bsResult);
426                 myResult = myResult + tailString;
427 
428                 return myResult;
429             }
430 
431             return string.Empty;
432 
433         }
434 
435         /// <summary>
436         /// 加密文件流
437         /// </summary>
438         /// <param name="fs"></param>
439         /// <returns></returns>
440         public static CryptoStream AES_EncryptStrream(FileStream fs, string decryptKey)
441         {
442             decryptKey = GetSubString(decryptKey, 32, "");
443             decryptKey = decryptKey.PadRight(32, ' ');
444 
445             RijndaelManaged rijndaelProvider = new RijndaelManaged();
446             rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
447             rijndaelProvider.IV = Keys;
448 
449             ICryptoTransform encrypto = rijndaelProvider.CreateEncryptor();
450             CryptoStream cytptostreamEncr = new CryptoStream(fs, encrypto, CryptoStreamMode.Write);
451             return cytptostreamEncr;
452         }
453 
454         /// <summary>
455         /// 解密文件流
456         /// </summary>
457         /// <param name="fs"></param>
458         /// <returns></returns>
459         public static CryptoStream AES_DecryptStream(FileStream fs, string decryptKey)
460         {
461             decryptKey = GetSubString(decryptKey, 32, "");
462             decryptKey = decryptKey.PadRight(32, ' ');
463 
464             RijndaelManaged rijndaelProvider = new RijndaelManaged();
465             rijndaelProvider.Key = Encoding.UTF8.GetBytes(decryptKey);
466             rijndaelProvider.IV = Keys;
467             ICryptoTransform Decrypto = rijndaelProvider.CreateDecryptor();
468             CryptoStream cytptostreamDecr = new CryptoStream(fs, Decrypto, CryptoStreamMode.Read);
469             return cytptostreamDecr;
470         }
471 
472         /// <summary>
473         /// 对指定文件加密
474         /// </summary>
475         /// <param name="InputFile"></param>
476         /// <param name="OutputFile"></param>
477         /// <returns></returns>
478         public static bool AES_EncryptFile(string InputFile, string OutputFile)
479         {
480             try
481             {
482                 string decryptKey = "www.iqidi.com";
483 
484                 FileStream fr = new FileStream(InputFile, FileMode.Open);
485                 FileStream fren = new FileStream(OutputFile, FileMode.Create);
486                 CryptoStream Enfr = AES_EncryptStrream(fren, decryptKey);
487                 byte[] bytearrayinput = new byte[fr.Length];
488                 fr.Read(bytearrayinput, 0, bytearrayinput.Length);
489                 Enfr.Write(bytearrayinput, 0, bytearrayinput.Length);
490                 Enfr.Close();
491                 fr.Close();
492                 fren.Close();
493             }
494             catch
495             {
496                 //文件异常
497                 return false;
498             }
499             return true;
500         }
501 
502         /// <summary>
503         /// 对指定的文件解压缩
504         /// </summary>
505         /// <param name="InputFile"></param>
506         /// <param name="OutputFile"></param>
507         /// <returns></returns>
508         public static bool AES_DecryptFile(string InputFile, string OutputFile)
509         {
510             try
511             {
512                 string decryptKey = "www.iqidi.com";
513                 FileStream fr = new FileStream(InputFile, FileMode.Open);
514                 FileStream frde = new FileStream(OutputFile, FileMode.Create);
515                 CryptoStream Defr = AES_DecryptStream(fr, decryptKey);
516                 byte[] bytearrayoutput = new byte[1024];
517                 int m_count = 0;
518 
519                 do
520                 {
521                     m_count = Defr.Read(bytearrayoutput, 0, bytearrayoutput.Length);
522                     frde.Write(bytearrayoutput, 0, m_count);
523                     if (m_count < bytearrayoutput.Length)
524                         break;
525                 } while (true);
526 
527                 Defr.Close();
528                 fr.Close();
529                 frde.Close();
530             }
531             catch
532             {
533                 //文件异常
534                 return false;
535             }
536             return true;
537         }
538 
539         #endregion
540 
541         #region RSA加密 解密
542 
543         /// <summary>RSA加密
544         /// 
545         /// </summary>
546         /// <param name="plaintext">明文</param>
547         /// <param name="publicKey">公钥</param>
548         /// <returns>密文字符串</returns>
549         public static string EncryptByRSA(string plaintext, string publicKey)
550         {
551             try
552             {
553                 UnicodeEncoding ByteConverter = new UnicodeEncoding();
554                 byte[] dataToEncrypt = ByteConverter.GetBytes(plaintext);
555                 using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
556                 {
557                     RSA.FromXmlString(publicKey);
558                     byte[] encryptedData = RSA.Encrypt(dataToEncrypt, false);
559                     return Convert.ToBase64String(encryptedData);
560                 }
561             }
562             catch (Exception)
563             {
564                 return null;
565             }
566 
567         }
568 
569 
570         /// <summary> RSA解密
571         ///
572         /// </summary>
573         /// <param name="ciphertext">密文</param>
574         /// <param name="privateKey">私钥</param>
575         /// <returns>明文字符串</returns>
576         public static string DecryptByRSA(string ciphertext, string privateKey)
577         {
578             try
579             {
580                 UnicodeEncoding byteConverter = new UnicodeEncoding();
581                 using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider())
582                 {
583                     RSA.FromXmlString(privateKey);
584                     byte[] encryptedData = Convert.FromBase64String(ciphertext);
585                     byte[] decryptedData = RSA.Decrypt(encryptedData, false);
586                     return byteConverter.GetString(decryptedData);
587                 }
588             }
589             catch (Exception)
590             {
591                 return null;
592             }
593 
594         }
595 
596 
597         /// <summary>生成RSA加密 解密的 密钥
598         /// 生成的key就是 方法EncryptByRSA与DecryptByRSA用的key了
599         /// </summary>
600         /// <param name="path">要生成的密钥文件的路径(文件夹)</param>
601         public static void getRSAKey(string path)
602         {
603             RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
604             string datetimestr = System.DateTime.Now.ToString("yyyyMMddHHmmss");
605             using (StreamWriter writer = new StreamWriter("RSA解密_PrivateKey_" + datetimestr + ".xml"))  //这个文件要保密...
606             {
607                 writer.WriteLine(rsa.ToXmlString(true));
608             }
609             using (StreamWriter writer = new StreamWriter("RSA加密_PublicKey_" + datetimestr + ".xml"))
610             {
611                 writer.WriteLine(rsa.ToXmlString(false));
612             }
613         }
614         #endregion
615 
616         #region Base64加密解密
617 
618         /// <summary>
619         /// Base64是一種使用64基的位置計數法。它使用2的最大次方來代表僅可列印的ASCII 字元。
620         /// 這使它可用來作為電子郵件的傳輸編碼。在Base64中的變數使用字元A-Z、a-z和0-9 ,
621         /// 這樣共有62個字元,用來作為開始的64個數字,最後兩個用來作為數字的符號在不同的
622         /// 系統中而不同。
623         /// Base64加密
624         /// </summary>
625         /// <param name="str"></param>
626         /// <returns></returns>
627         public static string Base64Encrypt(string str)
628         {
629             byte[] encbuff = System.Text.Encoding.UTF8.GetBytes(str);
630             return Convert.ToBase64String(encbuff);
631         }
632 
633         /// <summary>
634         /// Base64解密
635         /// </summary>
636         /// <param name="str"></param>
637         /// <returns></returns>
638         public static string Base64Decrypt(string str)
639         {
640             byte[] decbuff = Convert.FromBase64String(str);
641             return System.Text.Encoding.UTF8.GetString(decbuff);
642         }
643         #endregion
644 
645         #region MD5
646         /// <summary>
647 
648         /// 获得32位的MD5加密
649         /// </summary>
650         /// <param name="input"></param>
651         /// <returns></returns>
652         public static string GetMD5_32(string input)
653         {
654             MD5 md5 = MD5.Create();
655             byte[] data = md5.ComputeHash(Encoding.Default.GetBytes(input));
656             StringBuilder sb = new StringBuilder();
657             for (int i = 0; i < data.Length; i++)
658             {
659                 sb.AppendFormat("{0:X2}", data[i]);
660             }
661             return sb.ToString();
662         }
663 
664         /// <summary>
665         /// 获得16位的MD5加密
666         /// </summary>
667         /// <param name="input"></param>
668         /// <returns></returns>
669         public static string GetMD5_16(string input)
670         {
671             return GetMD5_32(input).Substring(8, 16);
672         }
673         /// <summary>
674         /// 获得8位的MD5加密
675         /// </summary>
676         /// <param name="input"></param>
677         /// <returns></returns>
678         public static string GetMD5_8(string input)
679         {
680             return GetMD5_32(input).Substring(8, 8);
681         }
682         /// <summary>
683         /// 获得4位的MD5加密
684         /// </summary>
685         /// <param name="input"></param>
686         /// <returns></returns>
687         public static string GetMD5_4(string input)
688         {
689             return GetMD5_32(input).Substring(8, 4);
690         }
691 
692         public static string MD5EncryptHash(String input)
693         {
694             MD5 md5 = new MD5CryptoServiceProvider();
695             //the GetBytes method returns byte array equavalent of a string
696             byte[] res = md5.ComputeHash(Encoding.Default.GetBytes(input), 0, input.Length);
697             char[] temp = new char[res.Length];
698             //copy to a char array which can be passed to a String constructor
699             Array.Copy(res, temp, res.Length);
700             //return the result as a string
701             return new String(temp);
702         }
703         #endregion
704 
705         #region MD5签名验证
706 
707         /// <summary>
708         /// 对给定文件路径的文件加上标签
709         /// </summary>
710         /// <param name="path">要加密的文件的路径</param>
711         /// <returns>标签的值</returns>
712         public static bool AddMD5(string path)
713         {
714             bool IsNeed = true;
715 
716             if (CheckMD5(path))                                  //已进行MD5处理
717                 IsNeed = false;
718 
719             try
720             {
721                 FileStream fsread = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
722                 byte[] md5File = new byte[fsread.Length];
723                 fsread.Read(md5File, 0, (int)fsread.Length);                               // 将文件流读取到Buffer中
724                 fsread.Close();
725 
726                 if (IsNeed)
727                 {
728                     string result = MD5Buffer(md5File, 0, md5File.Length);             // 对Buffer中的字节内容算MD5
729                     byte[] md5 = System.Text.Encoding.ASCII.GetBytes(result);       // 将字符串转换成字节数组以便写人到文件中
730                     FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
731                     fsWrite.Write(md5File, 0, md5File.Length);                               // 将文件,MD5值 重新写入到文件中。
732                     fsWrite.Write(md5, 0, md5.Length);
733                     fsWrite.Close();
734                 }
735                 else
736                 {
737                     FileStream fsWrite = new FileStream(path, FileMode.Open, FileAccess.ReadWrite);
738                     fsWrite.Write(md5File, 0, md5File.Length);
739                     fsWrite.Close();
740                 }
741             }
742             catch
743             {
744                 return false;
745             }
746 
747             return true;
748         }
749 
750         /// <summary>
751         /// 对给定路径的文件进行验证
752         /// </summary>
753         /// <param name="path"></param>
754         /// <returns>是否加了标签或是否标签值与内容值一致</returns>
755         public static bool CheckMD5(string path)
756         {
757             try
758             {
759                 FileStream get_file = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
760                 byte[] md5File = new byte[get_file.Length];                                      // 读入文件
761                 get_file.Read(md5File, 0, (int)get_file.Length);
762                 get_file.Close();
763 
764                 string result = MD5Buffer(md5File, 0, md5File.Length - 32);             // 对文件除最后32位以外的字节计算MD5,这个32是因为标签位为32位。
765                 string md5 = System.Text.Encoding.ASCII.GetString(md5File, md5File.Length - 32, 32);   //读取文件最后32位,其中保存的就是MD5值
766                 return result == md5;
767             }
768             catch
769             {
770                 return false;
771             }
772         }
773 
774         /// <summary>
775         /// 计算文件的MD5值
776         /// </summary>
777         /// <param name="MD5File">MD5签名文件字符数组</param>
778         /// <param name="index">计算起始位置</param>
779         /// <param name="count">计算终止位置</param>
780         /// <returns>计算结果</returns>
781         private static string MD5Buffer(byte[] MD5File, int index, int count)
782         {
783             System.Security.Cryptography.MD5CryptoServiceProvider get_md5 = new System.Security.Cryptography.MD5CryptoServiceProvider();
784             byte[] hash_byte = get_md5.ComputeHash(MD5File, index, count);
785             string result = System.BitConverter.ToString(hash_byte);
786 
787             result = result.Replace("-", "");
788             return result;
789         }
790         #endregion
791 
792         #region  SHA256加密算法
793 
794 
795         /// <summary>
796         /// SHA256函数
797         /// </summary>
798         /// <param name="str">原始字符串</param>
799         /// <returns>SHA256结果(返回长度为44字节的字符串)</returns>
800         public static string SHA256(string str)
801         {
802             byte[] SHA256Data = Encoding.UTF8.GetBytes(str);
803             SHA256Managed Sha256 = new SHA256Managed();
804             byte[] Result = Sha256.ComputeHash(SHA256Data);
805             return Convert.ToBase64String(Result);  //返回长度为44字节的字符串
806         }
807         #endregion
808 
809         #region RC4加密 解密
810 
811         /// <summary>RC4加密算法
812         /// 返回进过rc4加密过的字符
813         /// </summary>
814         /// <param name="str">被加密的字符</param>
815         /// <param name="ckey">密钥</param>
816         public static string EncryptRC4wq(string str, string ckey)
817         {
818             int[] s = new int[256];
819             for (int i = 0; i < 256; i++)
820             {
821                 s[i] = i;
822             }
823             //密钥转数组
824             char[] keys = ckey.ToCharArray();//密钥转字符数组
825             int[] key = new int[keys.Length];
826             for (int i = 0; i < keys.Length; i++)
827             {
828                 key[i] = keys[i];
829             }
830             //明文转数组
831             char[] datas = str.ToCharArray();
832             int[] mingwen = new int[datas.Length];
833             for (int i = 0; i < datas.Length; i++)
834             {
835                 mingwen[i] = datas[i];
836             }
837 
838             //通过循环得到256位的数组(密钥)
839             int j = 0;
840             int k = 0;
841             int length = key.Length;
842             int a;
843             for (int i = 0; i < 256; i++)
844             {
845                 a = s[i];
846                 j = (j + a + key[k]);
847                 if (j >= 256)
848                 {
849                     j = j % 256;
850                 }
851                 s[i] = s[j];
852                 s[j] = a;
853                 if (++k >= length)
854                 {
855                     k = 0;
856                 }
857             }
858             //根据上面的256的密钥数组 和 明文得到密文数组
859             int x = 0, y = 0, a2, b, c;
860             int length2 = mingwen.Length;
861             int[] miwen = new int[length2];
862             for (int i = 0; i < length2; i++)
863             {
864                 x = x + 1;
865                 x = x % 256;
866                 a2 = s[x];
867                 y = y + a2;
868                 y = y % 256;
869                 s[x] = b = s[y];
870                 s[y] = a2;
871                 c = a2 + b;
872                 c = c % 256;
873                 miwen[i] = mingwen[i] ^ s[c];
874             }
875             //密文数组转密文字符
876             char[] mi = new char[miwen.Length];
877             for (int i = 0; i < miwen.Length; i++)
878             {
879                 mi[i] = (char)miwen[i];
880             }
881             string miwenstr = new string(mi);
882             return miwenstr;
883         }
884 
885         /// <summary>RC4解密算法
886         /// 返回进过rc4解密过的字符
887         /// </summary>
888         /// <param name="str">被解密的字符</param>
889         /// <param name="ckey">密钥</param>
890         public static string DecryptRC4wq(string str, string ckey)
891         {
892             int[] s = new int[256];
893             for (int i = 0; i < 256; i++)
894             {
895                 s[i] = i;
896             }
897             //密钥转数组
898             char[] keys = ckey.ToCharArray();//密钥转字符数组
899             int[] key = new int[keys.Length];
900             for (int i = 0; i < keys.Length; i++)
901             {
902                 key[i] = keys[i];
903             }
904             //密文转数组
905             char[] datas = str.ToCharArray();
906             int[] miwen = new int[datas.Length];
907             for (int i = 0; i < datas.Length; i++)
908             {
909                 miwen[i] = datas[i];
910             }
911 
912             //通过循环得到256位的数组(密钥)
913             int j = 0;
914             int k = 0;
915             int length = key.Length;
916             int a;
917             for (int i = 0; i < 256; i++)
918             {
919                 a = s[i];
920                 j = (j + a + key[k]);
921                 if (j >= 256)
922                 {
923                     j = j % 256;
924                 }
925                 s[i] = s[j];
926                 s[j] = a;
927                 if (++k >= length)
928                 {
929                     k = 0;
930                 }
931             }
932             //根据上面的256的密钥数组 和 密文得到明文数组
933             int x = 0, y = 0, a2, b, c;
934             int length2 = miwen.Length;
935             int[] mingwen = new int[length2];
936             for (int i = 0; i < length2; i++)
937             {
938                 x = x + 1;
939                 x = x % 256;
940                 a2 = s[x];
941                 y = y + a2;
942                 y = y % 256;
943                 s[x] = b = s[y];
944                 s[y] = a2;
945                 c = a2 + b;
946                 c = c % 256;
947                 mingwen[i] = miwen[i] ^ s[c];
948             }
949             //明文数组转明文字符
950             char[] ming = new char[mingwen.Length];
951             for (int i = 0; i < mingwen.Length; i++)
952             {
953                 ming[i] = (char)mingwen[i];
954             }
955             string mingwenstr = new string(ming);
956             return mingwenstr;
957         }
958         #endregion
959     }
960 }
View Code

 

posted @ 2018-04-18 12:23  gygang  阅读(4015)  评论(0编辑  收藏  举报