1,對文件進行加密與解密(Windows窗體應用程序中做一個簡單的加密與解密功能)
步驟:
(一):創建一個Windows窗體應用程序
(二):在該窗體中添加一個TextBox控件,用來顯示文件路徑。一個OpenFileDialog控件,用來選擇要加密或解密的文件。添加三個Button控件。用來執行加密、解密和選擇文件操作
(三):代碼如下
1 //獲取文件路徑 2 private void button1_Click(object sender, EventArgs e) 3 { 4 OpenFileDialog openFile = new OpenFileDialog();//創建打開文件對話對話框對象 5 if (openFile.ShowDialog() == DialogResult.OK)//判斷是否選中文件 6 { 7 textBox1.Text = openFile.FileName; 8 } 9 } 10 11 //單擊“加密”按鈕實現對選擇的文本進行加密,“加密”按鈕的Click事件代碼如下; 12 //加密 13 private void button3_Click(object sender, EventArgs e) 14 { 15 if (textBox1.Text == "")//若沒選擇要加密的文本文件 16 { 17 MessageBox.Show("1請選擇要加密的文件");//如果沒有選擇則彈出提示 18 } 19 else 20 { 21 try 22 { 23 string strPath = textBox1.Text;//加密文件的路徑 24 int intLent = strPath.LastIndexOf("\\") + 1;//設置截取的起始位置 25 int intLong = strPath.Length;//設置截取的長度 26 string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名稱 27 int intTxt = strName.LastIndexOf(".");//設置截取的起始位置 28 int intTxtLeng = strName.Length;//設置截取的長度 29 string strTxt = strName.Substring(intTxt, intTxtLeng - intTxt);//取出文件的拓展名 30 strName = strName.Substring(0, intTxt); 31 string strOutName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + "Out" + strTxt;//加密后的文件名及路徑 32 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 };//加密文件密鑰 33 byte[] Iv = { 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; 34 RijndaelManaged myRijndael = new RijndaelManaged(); 35 FileStream fsOut = File.Open(strOutName, FileMode.Create, FileAccess.Write); 36 FileStream fsIn = File.Open(strPath, FileMode.Open, FileAccess.Read); 37 CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, Iv), CryptoStreamMode.Write);//寫入加密文本文件 38 BinaryReader br = new BinaryReader(fsIn);//創建閱讀器來加密文件 39 csDecrypt.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length);//將數據寫入加密文件 40 csDecrypt.Close();//關閉CryptoStream對象 41 fsIn.Close();//關閉FileStream對象 42 fsOut.Close();//關閉FileStream對象 43 if (MessageBox.Show("加密成功!加密后的文件名及路徑為:\n" + strOutName + ",是否刪除文件", "提示信息", MessageBoxButtons.YesNo) == DialogResult.Yes) 44 { 45 File.Delete(strPath);//清除指定文件 46 textBox1.Text = "";//請空文本文件 47 } 48 else 49 { 50 textBox1.Text = ""; 51 } 52 } 53 catch (Exception ex) 54 { 55 56 MessageBox.Show(ex.Message); 57 } 58 } 59 } 60 61 //單擊“解密”按鈕實現對選擇的文本進行加密,“解密”按鈕的Click事件代碼如下; 62 //解密 63 private void button2_Click(object sender, EventArgs e) 64 { 65 if (textBox1.Text == "")//若沒選擇要解密的文本文件 66 { 67 MessageBox.Show("請選擇要解密的文件");//如果沒有選擇則彈出提示 68 } 69 else 70 { 71 try 72 { 73 string strPath = textBox1.Text;//加密文件的路徑 74 int intLent = strPath.LastIndexOf("\\") + 1;//設置截取的起始位置 75 int intLong = strPath.Length;//設置截取的長度 76 string strName = strPath.Substring(intLent, intLong - intLent);//要加密的文件名稱 77 int intTxt = strName.LastIndexOf(".");//設置截取的起始位置 78 int intTxtLeng = strName.Length;//設置截取的長度 79 strName = strName.Substring(0, intTxt);//獲取文件拓展名 80 if (strName.LastIndexOf("Out") != -1) 81 { 82 strName = strName.Substring(0, strName.LastIndexOf("Out")); 83 } 84 else 85 { 86 strName = strName + "In"; 87 } 88 string strInName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName+ ".txt";//解密后的文件名及路徑 89 //解密文件密鑰 90 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; 91 byte[] Iv = { 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; 92 RijndaelManaged myRijndael = new RijndaelManaged();//創建RijndaelManaged對象 93 FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read);//創建FileStream對象 94 CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, Iv), CryptoStreamMode.Read); 95 StreamReader sr = new StreamReader(csDecrypt);//把文件讀出來 96 StreamWriter sw = new StreamWriter(strInName);//解密后寫一個新文件 97 sw.Write(sr.ReadToEnd()); 98 sw.Flush(); 99 sw.Close();//關閉FileStream對象 100 fsOut.Close();//關閉FileStream對象 101 if (MessageBox.Show("解密成功!解密后的文件名及路徑為:\n" + strInName + ",是否刪除文件", "提示信息", MessageBoxButtons.YesNo) == DialogResult.Yes) 102 { 103 File.Delete(strPath);//清除指定文件 104 textBox1.Text = "";//請空文本文件 105 } 106 else 107 { 108 textBox1.Text = ""; 109 } 110 } 111 catch (Exception ex) 112 { 113 114 MessageBox.Show(ex.Message); 115 } 116 } 117 }
(四):運行結果:

本例主要1用了System.Security.Cryptograhy命名空間子下的RijndaelManaged類的CreateDecryptor和CreateEncryptor方法以及CryptoStream類的Write方法。
(1):RijndaelManaged類
該類是訪問System.Security.Cryptography.Rijndal對稱加密算法的托管版本。其語法格式如下:
public sealed class RijndaelManaged:Rijndael
注意:此算法支持128、192或256位的密鑰長度
(2):CreateDecryptor方法
該方法位於RijndaelManaged類中,使用指定的Key和初始化向量(IV)創建對稱的Rijidael解密器對象。其語法格式如下:
public override ICryptoTransform CreateDecryptor(byte[] rgbKey,byte[] rgbIV)
參數說明:
rgbKey:用於對稱算法的機密密鑰
rgbIV:同於對稱算法的IV
返回值:對稱的Rijndael加密器對象
(3):CreateEncryptor方法
該方法位於RijndaelManaged類中,使用指定的Key和初始化向量(IV)創建對稱的Rijidael解密器對象。其語法格式如下:
public override ICryptoTransform CreateEncryptor(byte[] rgbKey,byte[] rgbIV)
參數說明:
rgbKey:用於對稱算法的機密密鑰
rgbIV:同於對稱算法的IV
返回值:對稱的Rijndael加密器對象
(4):CryptoStream類
該類定義了將數據流連接到加密轉換的流,它的構造器語法格式如下:
public CryptoStream(Stream, ICryptoTransform Transform,CryptoStreamMode mode);
參數說明:
stream:對其執行加密轉換的流
Transform:要對流執行的加密轉換
mode:CryptoStreamMode的枚舉值一。CryptoStreamMode的枚舉值及說明如下:
| 枚舉 | 說明 |
| Read | 對加密流的讀訪問 |
| Write | 對加密流的寫訪問 |
(5):CryptoStream類的Write方法
該方法將一個字節序列寫入當前的CryptoStream類中,並從當前位置寫入指定的字節數。其語法格式如下:
public override void Write(byte[] budder,int offset,in count)
參數說明:
buffer:字節數組。該方法將count個字節從buffer復制到當前流
offset:buffer中的字節偏移量,從此偏移量開始將字節復制到當前流
count:要寫入的當前流的字節數
