C#開發中經常使用加密解密方法解析
算法
我想這是你們都常聽過的算法,可能也用的比較多。那麼什麼是MD5算法呢?MD5全稱是數據庫
message-digest algorithm 5【|ˈmesidʒ|-|daiˈdʒest|-|ˈælɡəriðəm|】,簡單的說就是單向的加密,便是說沒法根據密文推導出明文。express
MD5主要用途:數組
一、對一段信息生成信息摘要,該摘要對該信息具備惟一性,能夠做爲數字簽名。安全
二、用於驗證文件的有效性(是否有丟失或損壞的數據),ide
三、對用戶密碼的加密,函數
四、在哈希函數中計算散列值ui
從上邊的主要用途中咱們看到,因爲算法的某些不可逆特徵,在加密應用上有較好的安全性。經過使用MD5加密算法,咱們輸入一個任意長度的字節串,都會生成一個128位的整數。因此根據這一點MD5被普遍的用做密碼加密。下面我就像你們演示一下怎樣進行密碼加密。編碼
先看下演示效果:加密
具體代碼以下:
首先須要引入命名空間:
using System.Security; using System.Security.Cryptography; private void btnmd5_Click(object sender, EventArgs e) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] palindata = Encoding.Default.GetBytes(txtyuan.Text);//將要加密的字符串轉換爲字節數組 byte[] encryptdata=md5.ComputeHash(palindata);//將字符串加密後也轉換爲字符數組 txtjiami.Text = Convert.ToBase64String(encryptdata);//將加密後的字節數組轉換爲加密字符串 }
這裏咱們須要注意的是,不管是在加密的過程當中,加密前要將加密字符串轉爲字節數組,加密後也要生成密文的字節數據,而後再轉化爲密文。
在談RSA加密算法以前,咱們須要先了解下兩個專業名詞,對稱加密和非對稱加密。
對稱加密即:含有一個稱爲密鑰的東西,在消息發送前使用密鑰對消息進行加密,在對方收到消息以後,使用相同的密鑰進行解密
非對稱加密即:加密和解密使用不一樣的密鑰的一類加密算法。這類加密算法一般有兩個密鑰A和B,使用密鑰A加密數據獲得的密文,只有密鑰B能夠進行解密操做(即便密鑰A也沒法解密),相反,使用了密鑰B加密數據獲得的密文,只有密鑰A能夠解密。這兩個密鑰分別稱爲私鑰和公鑰,顧名思義,私鑰就是你我的保留,不能公開的密鑰,而公鑰則是公開給加解密操做的另外一方的。根據不一樣用途,對數據進行加密所使用的密鑰也不相同(有時用公鑰加密,私鑰解密;有時相反用私鑰加密,公鑰解密)。非對稱加密的表明算法是RSA算法。
瞭解了這兩個名詞下面來說,RSA加密算法。RSA取名來自開發他們三者的名字。RSA是目前最有影響力的公鑰加密算法,多用於數據加密和數字簽名。雖然有這麼大的影響力,可是同時它也有一些弊端,它產生密鑰很麻煩,受到素數產生技術的限制,於是難以作到一次一密,分組長度太大等。
下面經過示例演示使用RSA加密、解密,引用名稱空間System.Security.Cryptography;
//加密 private string Encryption(string express) { CspParameters param = new CspParameters(); param.KeyContainerName = "oa_erp_dowork";//密匙容器的名稱,保持加密解密一致才能解密成功 using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param)) { byte[] plaindata = Encoding.Default.GetBytes(express);//將要加密的字符串轉換爲字節數組 byte[] encryptdata = rsa.Encrypt(plaindata, false);//將加密後的字節數據轉換爲新的加密字節數組 return Convert.ToBase64String(encryptdata);//將加密後的字節數組轉換爲字符串 } } //解密 private string Decrypt(string ciphertext) { CspParameters param = new CspParameters(); param.KeyContainerName = "oa_erp_dowork"; using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(param)) { byte[] encryptdata = Convert.FromBase64String(ciphertext); byte[] decryptdata = rsa.Decrypt(encryptdata, false); return Encoding.Default.GetString(decryptdata); } }
下面我再經過一個示例向你們演示,經過使用RSA加密算法產出公匙和私匙
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); using (StreamWriter sw = new StreamWriter(Server.MapPath("PublicKey.xml")))//產生公匙 { sw.WriteLine(rsa.ToXmlString(false)); } using (StreamWriter sw = new StreamWriter(Server.MapPath("PrivateKey.xml")))//產生私匙(也包含私匙) { sw.WriteLine(rsa.ToXmlString(true)); }
DES加密:使用一個 56 位的密鑰以及附加的 8 位奇偶校驗位,產生最大 64 位的分組大小。這是一個迭代的分組密碼,使用稱爲 Feistel 的技術,其中將加密的文本塊分紅兩半。使用子密鑰對其中一半應用循環功能,而後將輸出與另外一半進行「異或」運算;接着交換這兩半,這一過程會繼續下去,但最後一個循環不交換。DES 使用 16 個循環,使用異或,置換,代換,移位操做四種基本運算。額專業術語就看看得了,下面直接給你們演示一個小demo,以幫助你們的理解。
先定義一個全局的字節數組和實例化一個全局的DESCryptoServiceProvider對象
byte[] buffer;
DESCryptoServiceProvider DesCSP = new DESCryptoServiceProvider();
加密: private void button2_Click(object sender, EventArgs e) { MemoryStream ms = new MemoryStream();//先建立 一個內存流 CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateEncryptor(), CryptoStreamMode.Write);//將內存流鏈接到加密轉換流 StreamWriter sw = new StreamWriter(cryStream); sw.WriteLine(txtyuan.Text);//將要加密的字符串寫入加密轉換流 sw.Close(); cryStream.Close(); buffer = ms.ToArray();//將加密後的流轉換爲字節數組 txtjiami.Text =Convert.ToBase64String(buffer);//將加密後的字節數組轉換爲字符串 } 解密: private void button1_Click(object sender, EventArgs e) { MemoryStream ms = new MemoryStream(buffer);//將加密後的字節數據加入內存流中 CryptoStream cryStream = new CryptoStream(ms, DesCSP.CreateDecryptor(), CryptoStreamMode.Read);//內存流鏈接到解密流中 StreamReader sr = new StreamReader(cryStream); txthjiemi.Text = sr.ReadLine();//將解密流讀取爲字符串 sr.Close(); cryStream.Close(); ms.Close(); }
此外還有AES加密算法,可是AES加密是一個新的能夠用於保護電子數據的加密算法。其產生的密碼是迭代對稱的分組密碼,代加密使用一個循環結構,在該循環中重複置換和替換輸入數據。由於用的不是不少,在這裏就再也不作具體的演示了。
1 //SHA-1算法 2 string password = 3 System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Password.Text, 4 "SHA1"); 5 //MD5算法 6 string password1 = 7 System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(Password.Text, 8 "MD5"); 9 10 加密後生成不可逆密文保存到數據庫中。用戶登陸時用加密計算後的密文與數據庫中的密碼密文比較。一致則經過驗證,不一致則返回登陸錯誤。 11 這種加密算法是不可逆的,因此除了用戶本身,其餘人沒法得知用戶的真實密碼內容。 12 13 SHA-1算法和MD5算法的區別: 14 SHA-1比MD5多32位密文,因此更安全。因爲一樣的緣由,MD5比SHA-1的運算速度更快。 15 16 17 18 19 加密算法總彙 20 方法一: 21 22 //須添加對System.Web的引用 23 using System.Web.Security; 24 25 ... 26 27 28 /// <summary> 29 /// SHA1加密字符串 30 /// 31 </summary> 32 /// <param name="source">源字符串</param> 33 34 /// <returns>加密後的字符串</returns> 35 public string 36 SHA1(string source) 37 { 38 return 39 FormsAuthentication.HashPasswordForStoringInConfigFile(source, "SHA1"); 40 41 } 42 43 44 /// <summary> 45 /// MD5加密字符串 46 /// 47 </summary> 48 /// <param name="source">源字符串</param> 49 50 /// <returns>加密後的字符串</returns> 51 public string 52 MD5(string source) 53 { 54 return 55 FormsAuthentication.HashPasswordForStoringInConfigFile(source, "MD5");; 56 57 } 58 59 60 方法二(可逆加密解密): 61 using System.Security.Cryptography; 62 63 64 ... 65 66 public string Encode(string data) 67 { 68 69 byte[] byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); 70 71 byte[] byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); 72 73 74 DESCryptoServiceProvider cryptoProvider = new 75 DESCryptoServiceProvider(); 76 int i = cryptoProvider.KeySize; 77 78 MemoryStream ms = new MemoryStream(); 79 CryptoStream cst = 80 new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), 81 CryptoStreamMode.Write); 82 83 StreamWriter sw = new 84 StreamWriter(cst); 85 sw.Write(data); 86 sw.Flush(); 87 88 cst.FlushFinalBlock(); 89 sw.Flush(); 90 return 91 Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length); 92 93 } 94 95 96 public string Decode(string data) 97 { 98 byte[] 99 byKey = System.Text.ASCIIEncoding.ASCII.GetBytes(KEY_64); 100 byte[] 101 byIV = System.Text.ASCIIEncoding.ASCII.GetBytes(IV_64); 102 103 104 byte[] byEnc; 105 try 106 { 107 byEnc = 108 Convert.FromBase64String(data); 109 } 110 catch 111 { 112 113 return null; 114 } 115 116 117 DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider(); 118 119 MemoryStream ms = new MemoryStream(byEnc); 120 CryptoStream 121 cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), 122 CryptoStreamMode.Read); 123 StreamReader sr = new StreamReader(cst); 124 125 return sr.ReadToEnd(); 126 } 127 128 方法三(MD5不可逆): 129 using 130 System.Security.Cryptography; 131 132 ... 133 134 //MD5不可逆加密 135 136 137 //32位加密 138 139 public string GetMD5_32(string s, 140 string _input_charset) 141 { 142 MD5 md5 = new 143 MD5CryptoServiceProvider(); 144 byte[] t = 145 md5.ComputeHash(Encoding.GetEncoding(_input_charset).GetBytes(s)); 146 147 StringBuilder sb = new StringBuilder(32); 148 for (int i = 0; i < 149 t.Length; i++) 150 { 151 152 sb.Append(t[i].ToString("x").PadLeft(2, '0')); 153 } 154 return 155 sb.ToString(); 156 } 157 158 //16位加密 159 public static string 160 GetMd5_16(string ConvertString) 161 { 162 MD5CryptoServiceProvider 163 md5 = new MD5CryptoServiceProvider(); 164 string t2 = 165 BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(ConvertString)), 166 4, 8); 167 t2 = t2.Replace("-", ""); 168 return t2; 169 170 } 171 172 方法四(對稱加密): 173 using System.IO; 174 using 175 System.Security.Cryptography; 176 177 ... 178 179 private 180 SymmetricAlgorithm mobjCryptoService; 181 private string Key; 182 /// 183 <summary> 184 /// 對稱加密類的構造函數 185 /// </summary> 186 187 public SymmetricMethod() 188 { 189 mobjCryptoService = new 190 RijndaelManaged(); 191 Key = 192 "Guz(%&hj7x89H$yuBI0456FtmaT5&fvHUFCy76*h%(HilJ$lhj!y6&(*jkP87jH7"; 193 194 } 195 /// <summary> 196 /// 得到密鑰 197 /// 198 </summary> 199 /// <returns>密鑰</returns> 200 201 private byte[] GetLegalKey() 202 { 203 string sTemp = Key; 204 205 mobjCryptoService.GenerateKey(); 206 byte[] bytTemp = 207 mobjCryptoService.Key; 208 int KeyLength = bytTemp.Length; 209 210 if (sTemp.Length > KeyLength) 211 sTemp = sTemp.Substring(0, 212 KeyLength); 213 else if (sTemp.Length < KeyLength) 214 215 sTemp = sTemp.PadRight(KeyLength, ' '); 216 return 217 ASCIIEncoding.ASCII.GetBytes(sTemp); 218 } 219 /// <summary> 220 221 /// 得到初始向量IV 222 /// </summary> 223 /// 224 <returns>初試向量IV</returns> 225 private byte[] GetLegalIV() 226 227 { 228 string sTemp = 229 "E4ghj*Ghg7!rNIfb&95GUY86GfghUb#er57HBh(u%g6HJ($jhWk7&!hg4ui%$hjk"; 230 231 mobjCryptoService.GenerateIV(); 232 byte[] bytTemp = 233 mobjCryptoService.IV; 234 int IVLength = bytTemp.Length; 235 if 236 (sTemp.Length > IVLength) 237 sTemp = sTemp.Substring(0, 238 IVLength); 239 else if (sTemp.Length < IVLength) 240 241 sTemp = sTemp.PadRight(IVLength, ' '); 242 return 243 ASCIIEncoding.ASCII.GetBytes(sTemp); 244 } 245 /// <summary> 246 247 /// 加密方法 248 /// </summary> 249 /// <param 250 name="Source">待加密的串</param> 251 /// 252 <returns>通過加密的串</returns> 253 public string Encrypto(string 254 Source) 255 { 256 byte[] bytIn = UTF8Encoding.UTF8.GetBytes(Source); 257 258 MemoryStream ms = new MemoryStream(); 259 260 mobjCryptoService.Key = GetLegalKey(); 261 mobjCryptoService.IV = 262 GetLegalIV(); 263 ICryptoTransform encrypto = 264 mobjCryptoService.CreateEncryptor(); 265 CryptoStream cs = new 266 CryptoStream(ms, encrypto, CryptoStreamMode.Write); 267 cs.Write(bytIn, 268 0, bytIn.Length); 269 cs.FlushFinalBlock(); 270 ms.Close(); 271 272 byte[] bytOut = ms.ToArray(); 273 return 274 Convert.ToBase64String(bytOut); 275 } 276 /// <summary> 277 278 /// 解密方法 279 /// </summary> 280 /// <param 281 name="Source">待解密的串</param> 282 /// 283 <returns>通過解密的串</returns> 284 public string Decrypto(string 285 Source) 286 { 287 byte[] bytIn = Convert.FromBase64String(Source); 288 289 MemoryStream ms = new MemoryStream(bytIn, 0, bytIn.Length); 290 291 mobjCryptoService.Key = GetLegalKey(); 292 293 mobjCryptoService.IV = GetLegalIV(); 294 ICryptoTransform encrypto = 295 mobjCryptoService.CreateDecryptor(); 296 CryptoStream cs = new 297 CryptoStream(ms, encrypto, CryptoStreamMode.Read); 298 StreamReader sr = 299 new StreamReader(cs); 300 return sr.ReadToEnd(); 301 302 } 303 304 方法五: 305 using System.IO; 306 using 307 System.Security.Cryptography; 308 using System.Text; 309 310 ... 311 312 313 //默認密鑰向量 314 private static byte[] Keys = { 0x12, 0x34, 315 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF }; 316 /// <summary> 317 /// 318 DES加密字符串 319 /// </summary> 320 /// <param 321 name="encryptString">待加密的字符串</param> 322 /// <param 323 name="encryptKey">加密密鑰,要求爲8位</param> 324 /// 325 <returns>加密成功返回加密後的字符串,失敗返回源串</returns> 326 public static string 327 EncryptDES(string encryptString, string encryptKey) 328 { 329 330 try 331 { 332 byte[] rgbKey = 333 Encoding.UTF8.GetBytes(encryptKey.Substring(0, 8)); 334 byte[] rgbIV 335 = Keys; 336 byte[] inputByteArray = 337 Encoding.UTF8.GetBytes(encryptString); 338 DESCryptoServiceProvider 339 dCSP = new DESCryptoServiceProvider(); 340 MemoryStream mStream = 341 new MemoryStream(); 342 CryptoStream cStream = new 343 CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), 344 CryptoStreamMode.Write); 345 cStream.Write(inputByteArray, 0, 346 inputByteArray.Length); 347 cStream.FlushFinalBlock(); 348 349 return Convert.ToBase64String(mStream.ToArray()); 350 } 351 352 catch 353 { 354 return encryptString; 355 356 } 357 } 358 359 /// <summary> 360 /// DES解密字符串 361 362 /// </summary> 363 /// <param 364 name="decryptString">待解密的字符串</param> 365 /// <param 366 name="decryptKey">解密密鑰,要求爲8位,和加密密鑰相同</param> 367 /// 368 <returns>解密成功返回解密後的字符串,失敗返源串</returns> 369 public static string 370 DecryptDES(string decryptString, string decryptKey) 371 { 372 373 try 374 { 375 byte[] rgbKey = 376 Encoding.UTF8.GetBytes(decryptKey); 377 byte[] rgbIV = Keys; 378 379 byte[] inputByteArray = Convert.FromBase64String(decryptString); 380 381 DESCryptoServiceProvider DCSP = new DESCryptoServiceProvider(); 382 383 MemoryStream mStream = new MemoryStream(); 384 385 CryptoStream cStream = new CryptoStream(mStream, DCSP.CreateDecryptor(rgbKey, 386 rgbIV), CryptoStreamMode.Write); 387 cStream.Write(inputByteArray, 388 0, inputByteArray.Length); 389 cStream.FlushFinalBlock(); 390 391 return Encoding.UTF8.GetString(mStream.ToArray()); 392 } 393 394 catch 395 { 396 return decryptString; 397 398 } 399 } 400 401 方法六(文件加密): 402 using System.IO; 403 using 404 System.Security.Cryptography; 405 using System.Text; 406 407 ... 408 409 410 //加密文件 411 private static void EncryptData(String inName, 412 String outName, byte[] desKey, byte[] desIV) 413 { 414 //Create the 415 file streams to handle the input and output files. 416 FileStream fin = 417 new FileStream(inName, FileMode.Open, FileAccess.Read); 418 FileStream 419 fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); 420 421 fout.SetLength(0); 422 423 //Create variables to help 424 with read and write. 425 byte[] bin = new byte[100]; //This is 426 intermediate storage for the encryption. 427 long rdlen = 428 0; //This is the total number of bytes written. 429 long 430 totlen = fin.Length; //This is the total length of the input file. 431 432 int len; //This is the number of bytes to be 433 written at a time. 434 435 DES des = new 436 DESCryptoServiceProvider(); 437 CryptoStream encStream = new 438 CryptoStream(fout, des.CreateEncryptor(desKey, desIV), CryptoStreamMode.Write); 439 440 441 //Read from the input file, then encrypt and write to the 442 output file. 443 while (rdlen < totlen) 444 { 445 446 len = fin.Read(bin, 0, 100); 447 encStream.Write(bin, 0, len); 448 449 rdlen = rdlen + len; 450 } 451 452 453 encStream.Close(); 454 fout.Close(); 455 fin.Close(); 456 } 457 458 459 //解密文件 460 private static void DecryptData(String inName, 461 String outName, byte[] desKey, byte[] desIV) 462 { 463 //Create the 464 file streams to handle the input and output files. 465 FileStream fin = 466 new FileStream(inName, FileMode.Open, FileAccess.Read); 467 FileStream 468 fout = new FileStream(outName, FileMode.OpenOrCreate, FileAccess.Write); 469 470 fout.SetLength(0); 471 472 //Create variables to help 473 with read and write. 474 byte[] bin = new byte[100]; //This is 475 intermediate storage for the encryption. 476 long rdlen = 477 0; //This is the total number of bytes written. 478 long 479 totlen = fin.Length; //This is the total length of the input file. 480 481 int len; //This is the number of bytes to be 482 written at a time. 483 484 DES des = new 485 DESCryptoServiceProvider(); 486 CryptoStream encStream = new 487 CryptoStream(fout, des.CreateDecryptor(desKey, desIV), CryptoStreamMode.Write); 488 489 490 //Read from the input file, then encrypt and write to the 491 output file. 492 while (rdlen < totlen) 493 { 494 495 len = fin.Read(bin, 0, 100); 496 encStream.Write(bin, 0, len); 497 498 rdlen = rdlen + len; 499 } 500 501 502 encStream.Close(); 503 fout.Close(); 504 fin.Close(); 505 506 507 } 508 509 using System; 510 using 511 System.Security.Cryptography;//這個是處理文字編碼的前提 512 using System.Text; 513 using 514 System.IO; 515 /// <summary> 516 /// DES加密方法 517 /// </summary> 518 /// 519 <param name="strPlain">明文</param> 520 /// <param 521 name="strDESKey">密鑰</param> 522 /// <param 523 name="strDESIV">向量</param> 524 /// 525 <returns>密文</returns> 526 public string DESEncrypt(string 527 strPlain,string strDESKey,string strDESIV) 528 { 529 //把密鑰轉換成字節數組 530 byte[] 531 bytesDESKey=ASCIIEncoding.ASCII.GetBytes(strDESKey); 532 //把向量轉換成字節數組 533 byte[] 534 bytesDESIV=ASCIIEncoding.ASCII.GetBytes(strDESIV); 535 //聲明1個新的DES對象 536 DESCryptoServiceProvider 537 desEncrypt=new DESCryptoServiceProvider(); 538 //開闢一塊內存流 539 MemoryStream 540 msEncrypt=new MemoryStream(); 541 //把內存流對象包裝成加密流對象 542 CryptoStream 543 csEncrypt=new 544 CryptoStream(msEncrypt,desEncrypt.CreateEncryptor(bytesDESKey,bytesDESIV),CryptoStreamMode.Write); 545 //把加密流對象包裝成寫入流對象 546 StreamWriter 547 swEncrypt=new 548 StreamWriter(csEncrypt); 549 //寫入流對象寫入明文 550 swEncrypt.WriteLine(strPlain); 551 //寫入流關閉 552 swEncrypt.Close(); 553 //加密流關閉 554 csEncrypt.Close(); 555 //把內存流轉換成字節數組,內存流如今已是密文了 556 byte[] 557 bytesCipher=msEncrypt.ToArray(); 558 //內存流關閉 559 msEncrypt.Close(); 560 //把密文字節數組轉換爲字符串,並返回 561 return 562 UnicodeEncoding.Unicode.GetString(bytesCipher); 563 } 564 565 566 567 568 /// 569 <summary> 570 /// DES解密方法 571 /// </summary> 572 /// <param 573 name="strCipher">密文</param> 574 /// <param 575 name="strDESKey">密鑰</param> 576 /// <param 577 name="strDESIV">向量</param> 578 /// 579 <returns>明文</returns> 580 public string DESDecrypt(string 581 strCipher,string strDESKey,string strDESIV) 582 { 583 //把密鑰轉換成字節數組 584 byte[] 585 bytesDESKey=ASCIIEncoding.ASCII.GetBytes(strDESKey); 586 //把向量轉換成字節數組 587 byte[] 588 bytesDESIV=ASCIIEncoding.ASCII.GetBytes(strDESIV); 589 //把密文轉換成字節數組 590 byte[] 591 bytesCipher=UnicodeEncoding.Unicode.GetBytes(strCipher); 592 //聲明1個新的DES對象 593 DESCryptoServiceProvider 594 desDecrypt=new 595 DESCryptoServiceProvider(); 596 //開闢一塊內存流,並存放密文字節數組 597 MemoryStream 598 msDecrypt=new MemoryStream(bytesCipher); 599 //把內存流對象包裝成解密流對象 600 CryptoStream 601 csDecrypt=new 602 CryptoStream(msDecrypt,desDecrypt.CreateDecryptor(bytesDESKey,bytesDESIV),CryptoStreamMode.Read); 603 //把解密流對象包裝成讀出流對象 604 StreamReader 605 srDecrypt=new StreamReader(csDecrypt); 606 //明文=讀出流的讀出內容 607 string 608 strPlainText=srDecrypt.ReadLine(); 609 //讀出流關閉 610 srDecrypt.Close(); 611 //解密流關閉 612 csDecrypt.Close(); 613 //內存流關閉 614 msDecrypt.Close(); 615 //返回明文 616 return 617 strPlainText; 618 }