c#中對文件的加密與解密


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的枚舉值及說明如下:

CryptoStreamMode的枚舉值及說明
枚舉 說明
Read 對加密流的讀訪問
Write 對加密流的寫訪問

 

 

 

 

 

(5):CryptoStream類的Write方法
該方法將一個字節序列寫入當前的CryptoStream類中,並從當前位置寫入指定的字節數。其語法格式如下:
public override void Write(byte[] budder,int offset,in count)
參數說明:
buffer:字節數組。該方法將count個字節從buffer復制到當前流
offset:buffer中的字節偏移量,從此偏移量開始將字節復制到當前流
count:要寫入的當前流的字節數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM