字符串加密與解密
設(shè)計(jì)應(yīng)用程序時(shí),為了防止一些敏感信息的泄露,通常需要對(duì)這些信息進(jìn)行加密。以用戶的登錄密碼為例,如果密碼以明文的形式存儲(chǔ)在數(shù)據(jù)表中,很容易就會(huì)被人發(fā)現(xiàn);相反,如果密碼以密文的形式儲(chǔ)存,即使別人從數(shù)據(jù)表中發(fā)現(xiàn)了密碼,也是加密之后的密碼,根本不能使用。通過(guò)對(duì)密碼進(jìn)行加密,能夠極大地提高系統(tǒng)的保密性。下面通過(guò)一個(gè)實(shí)例講解如何對(duì)字符串進(jìn)行加密與解密。
例6.21 創(chuàng)建一個(gè)控制臺(tái)應(yīng)用程序,命名為EDString。在該程序中定義一個(gè)靜態(tài)的字符串變量,用來(lái)記錄加密密鑰。代碼如下:(實(shí)例位置:光盤\TM\第6章\例6.21) - static string encryptKey = "Oyea";
//定義密鑰
自定義一個(gè)返回值類型為string類型的Encrypt方法,用來(lái)對(duì)字符串進(jìn)行加密。該方法中有一個(gè)string類型的參數(shù),用來(lái)表示要加密的字符串。Encrypt方法實(shí)現(xiàn)代碼如下: - #region 加密字符串
- /// <summary>
- /// 加密字符串
- /// </summary>
- /// <param name="str">要加密的字符串</param>
- /// <returns>加密后的字符串</returns>
- static string Encrypt(string str)
- {
- DESCryptoServiceProvider descsp = new
DESCryptoServiceProvider(); //實(shí)例化加/解密類對(duì)象 - byte[] key = Encoding.Unicode.GetBytes(encryptKey);
//定義字節(jié)數(shù)組,用來(lái)存儲(chǔ)密鑰 - byte[] data = Encoding.Unicode.GetBytes(str);
//定義字節(jié)數(shù)組,用來(lái)存儲(chǔ)要加密的字符串 - MemoryStream MStream = new MemoryStream();
//實(shí)例化內(nèi)存流對(duì)象 - //使用內(nèi)存流實(shí)例化加密流對(duì)象
- CryptoStream CStream = new CryptoStream
(MStream, descsp.CreateEncryptor(key, key), CryptoStreamMode.Write); - CStream.Write(data, 0, data.Length);
//向加密流中寫入數(shù)據(jù) - CStream.FlushFinalBlock();
//釋放加密流 - return Convert.ToBase64String(MStream.ToArray());
//返回加密后的字符串 - }
- #endregion
說(shuō)明:由于加密、解密字符串時(shí),需要用到加密類和內(nèi)存流,所以首先需要在命名空間區(qū)域添加System.Security.Cryptography和System.IO命名空間。
自定義一個(gè)返回值類型為string類型的Decrypt方法,用來(lái)對(duì)加密后的字符串進(jìn)行解密。該方法中有一個(gè)string類型的參數(shù),用來(lái)表示要解密的字符串。Decrypt方法實(shí)現(xiàn)代碼如下: - #region 解密字符串
- /// <summary>
- /// 解密字符串
- /// </summary>
- /// <param name="str">要解密的字符串</param>
- /// <returns>解密后的字符串</returns>
- static string Decrypt(string str)
- {
- DESCryptoServiceProvider descsp = new
DESCryptoServiceProvider(); //實(shí)例化加/解密類對(duì)象 - byte[] key = Encoding.Unicode.GetBytes(encryptKey);
//定義字節(jié)數(shù)組,用來(lái)存儲(chǔ)密鑰 - byte[] data = Convert.FromBase64String(str);
//定義字節(jié)數(shù)組,用來(lái)存儲(chǔ)要解密的字符串 - MemoryStream MStream = new MemoryStream();
//實(shí)例化內(nèi)存流對(duì)象 - //使用內(nèi)存流實(shí)例化解密流對(duì)象
- CryptoStream CStream = new CryptoStream(MStream,
descsp.CreateDecryptor(key, key), CryptoStreamMode.Write); - CStream.Write(data, 0, data.Length);
//向解密流中寫入數(shù)據(jù) - CStream.FlushFinalBlock();
//釋放解密流 - return Encoding.Unicode.GetString
(MStream.ToArray()); //返回解密后的字符串 - }
- #endregion
在Main方法中,首先提示輸入信息;然后定義一個(gè)string類型的變量,用來(lái)記錄輸入的字符串;之后調(diào)用自定義方法Encrypt加密輸入的字符串,并使用一個(gè)string類型的變量記錄該字符串;接著調(diào)用自定義方法Decrypt對(duì)該字符串進(jìn)行解密;最后分別輸出加密和解密后的字符串。Main方法實(shí)現(xiàn)代碼如下: - static void Main(string[] args)
- {
- Console.Write("請(qǐng)輸入要加密的字符串:");
//提示輸入字符串 - Console.WriteLine();
//換行輸入 - string strOld = Console.ReadLine();
//記錄輸入的字符串 - string strNew = Encrypt(strOld);
//加密字符串 - Console.WriteLine("加密后的字符串:" + strNew);
//輸出加密后的字符串 - Console.WriteLine("解密后的字符串:" + Decrypt(strNew));
//解密字符串并輸出 - Console.ReadLine();
- }
程序運(yùn)行結(jié)果如圖6.5所示。
|
圖6.5 字符串加密與解密 |
|