目錄
項目結構
命名空間和類定義
主要控件
GroupBox 控件
Label 控件
TextBox 控件
Button 控件
OpenFileDialog 控件
方法說明
構造函數?Form1()
Dispose(bool disposing)
Main()
InitializeComponent()
加密和解密方法
異常處理
項目截圖:
項目源碼:
項目結構
-
命名空間和類定義
using
指令導入所需的命名空間。AesFile
命名空間包含整個應用程序。Form1
類繼承自System.Windows.Forms.Form
,是主窗體類。
主要控件
-
GroupBox 控件
groupBox1
: 包含加密文件相關的控件。groupBox2
: 包含解密文件相關的控件。
-
Label 控件
- 提示用戶輸入相關信息,例如“被加密文件名”、“設定密碼”。
-
TextBox 控件
textBox1
: 顯示被加密文件路徑,只讀。textBox2
: 輸入加密后輸出文件路徑。textBox3
?&?textBox4
: 輸入和確認加密密碼。textBox6
: 輸入解密密碼。textBox7
: 輸入解密后輸出文件路徑。textBox8
: 顯示已加密文件路徑,只讀。
-
Button 控件
button1
: 瀏覽并選擇被加密文件。button2
: 執行加密操作。button3
: 執行解密操作。button4
: 瀏覽并選擇已加密文件。
-
OpenFileDialog 控件
openFileDialog1
: 允許用戶選擇文件。
方法說明
構造函數?Form1()
public Form1()
構造函數調用InitializeComponent()
方法初始化控件。
Dispose(bool disposing)
- 清理所有正在使用的資源。
- 如果?
disposing
?為?true
,則釋放托管資源。 protected override void Dispose(bool disposing)
方法負責釋放非托管資源
Main()
- 應用程序的入口點。
- 啟動?
Form1
?窗口。
InitializeComponent()
- 自動生成的方法,包含界面元素的設計信息。
- 不應手動修改此方法的內容。
button1_Click(object sender, System.EventArgs e)
- 處理“瀏覽文件”按鈕點擊事件。
- 彈出文件對話框讓用戶選擇要加密的文件,并將文件路徑顯示在?
textBox1
?中。
button2_Click(object sender, System.EventArgs e)
- 處理“加密文件”按鈕點擊事件。
- 檢查用戶是否選擇了要加密的文件、提供了輸出文件名及有效的密碼。
- 根據提供的密碼生成 AES密鑰。
- 創建文件流進行加密操作。
- 使用?
EncryptFile
進行實際的加密過程。 - 加密完成后關閉所有流并彈出成功提示。
button4_Click(object sender, System.EventArgs e)
- 處理“瀏覽文件”按鈕點擊事件。
- 彈出文件對話框讓用戶選擇要解密的文件,并將文件路徑顯示在?
textBox8
?中。
button3_Click(object sender, System.EventArgs e)
- 處理“解密文件”按鈕點擊事件。
- 檢查用戶是否選擇了要解密的文件、提供了輸出文件名及有效的密碼。
- 根據提供的密碼生成 AES密鑰。
- 創建文件流進行解密操作。
- 使用?
DecryptFile
進行實際的解密過程。 - 解密完成后關閉所有流并彈出成功提示。
- 如果發生異常,則捕獲錯誤并顯示錯誤消息。
加密和解密方法
EncryptFile
方法使用Rijndael算法對文件進行加密,生成一個鹽值并與加密數據一起寫入輸出文件。DecryptFile
方法使用相同的密碼和鹽值對文件進行解密,將解密后的數據寫入輸出文件。GenerateSalt
方法生成一個隨機鹽值,增強安全性。
異常處理
- 在加密和解密過程中捕獲異常并提示用戶。
項目截圖:
項目源碼:
using System; using System.Drawing; using System.ComponentModel; using System.Windows.Forms; using System.IO; using System.Security.Cryptography;namespace AesFile {/// <summary>/// Form1 的摘要說明。/// </summary>public class Form1 : System.Windows.Forms.Form{// 定義各種控件變量private GroupBox groupBox1; // 用于加密文件設置的組框private Label label1; // 顯示“被加密文件名”的標簽private TextBox textBox1; // 顯示被加密文件名的文本框private TextBox textBox2; // 輸入加密輸出文件名的文本框private Label label2; // 顯示“加密輸出文件名”的標簽private TextBox textBox3; // 輸入設定密碼的文本框private Label label3; // 顯示“設定密碼(大于6位)”的標簽private TextBox textBox4; // 重復輸入設定密碼的文本框private Label label4; // 顯示“重復設定的密碼”的標簽private Button button1; // 瀏覽文件按鈕private Button button2; // 加密文件按鈕private GroupBox groupBox2; // 用于解密文件設置的組框private Button button3; // 解密文件按鈕private Button button4; // 瀏覽文件按鈕private TextBox textBox6; // 輸入解密密碼的文本框private Label label6; // 顯示“輸入密碼”的標簽private TextBox textBox7; // 輸入解密輸出文件名的文本框private Label label7; // 顯示“解密輸出文件名”的標簽private TextBox textBox8; // 顯示被解密文件名的文本框private Label label8; // 顯示“被解密文件名”的標簽private OpenFileDialog openFileDialog1; // 打開文件對話框private Container components = null; // 管理窗體組件的對象public Form1(){InitializeComponent(); // 初始化窗體組件}protected override void Dispose(bool disposing){if (disposing && (components != null)) // 如果正在釋放資源并且組件不為空{components.Dispose(); // 釋放所有托管資源}base.Dispose(disposing); // 調用基類的Dispose方法}#region Windows 窗體設計器生成的代碼private void InitializeComponent(){this.groupBox1 = new GroupBox(); // 實例化groupBox1this.button2 = new Button(); // 實例化button2this.button1 = new Button(); // 實例化button1this.textBox4 = new TextBox(); // 實例化textBox4this.label4 = new Label(); // 實例化label4this.textBox3 = new TextBox(); // 實例化textBox3this.label3 = new Label(); // 實例化label3this.textBox2 = new TextBox(); // 實例化textBox2this.label2 = new Label(); // 實例化label2this.textBox1 = new TextBox(); // 實例化textBox1this.label1 = new Label(); // 實例化label1this.groupBox2 = new GroupBox(); // 實例化groupBox2this.button3 = new Button(); // 實例化button3this.button4 = new Button(); // 實例化button4this.textBox6 = new TextBox(); // 實例化textBox6this.label6 = new Label(); // 實例化label6this.textBox7 = new TextBox(); // 實例化textBox7this.label7 = new Label(); // 實例化label7this.textBox8 = new TextBox(); // 實例化textBox8this.label8 = new Label(); // 實例化label8this.openFileDialog1 = new OpenFileDialog(); // 實例化openFileDialog1this.groupBox1.SuspendLayout(); // 暫停groupBox1布局邏輯this.groupBox2.SuspendLayout(); // 暫停groupBox2布局邏輯this.SuspendLayout(); // 暫停Form1布局邏輯// // groupBox1// this.groupBox1.Controls.Add(this.button2); // 將button2添加到groupBox1中this.groupBox1.Controls.Add(this.button1); // 將button1添加到groupBox1中this.groupBox1.Controls.Add(this.textBox4); // 將textBox4添加到groupBox1中this.groupBox1.Controls.Add(this.label4); // 將label4添加到groupBox1中this.groupBox1.Controls.Add(this.textBox3); // 將textBox3添加到groupBox1中this.groupBox1.Controls.Add(this.label3); // 將label3添加到groupBox1中this.groupBox1.Controls.Add(this.textBox2); // 將textBox2添加到groupBox1中this.groupBox1.Controls.Add(this.label2); // 將label2添加到groupBox1中this.groupBox1.Controls.Add(this.textBox1); // 將textBox1添加到groupBox1中this.groupBox1.Controls.Add(this.label1); // 將label1添加到groupBox1中this.groupBox1.Location = new Point(38, 24); // 設置groupBox1的位置this.groupBox1.Name = "groupBox1"; // 設置groupBox1的名稱this.groupBox1.Size = new Size(509, 209); // 設置groupBox1的大小this.groupBox1.TabIndex = 0; // 設置groupBox1的Tab索引this.groupBox1.TabStop = false; // 設置groupBox1是否顯示邊框this.groupBox1.Text = "加密文件設置"; // 設置groupBox1的標題文本// // button2// this.button2.Location = new Point(349, 160); // 設置button2的位置this.button2.Name = "button2"; // 設置button2的名稱this.button2.Size = new Size(80, 23); // 設置button2的大小this.button2.TabIndex = 9; // 設置button2的Tab索引this.button2.Text = "加密文件"; // 設置button2的文本this.button2.Click += new EventHandler(this.button2_Click); // 綁定button2的點擊事件處理程序// // button1// this.button1.Location = new Point(349, 121); // 設置button1的位置this.button1.Name = "button1"; // 設置button1的名稱this.button1.Size = new Size(80, 23); // 設置button1的大小this.button1.TabIndex = 8; // 設置button1的Tab索引this.button1.Text = "瀏覽文件"; // 設置button1的文本this.button1.Click += new EventHandler(this.button1_Click); // 綁定button1的點擊事件處理程序// // textBox4// this.textBox4.Location = new Point(120, 162); // 設置textBox4的位置this.textBox4.Name = "textBox4"; // 設置textBox4的名稱this.textBox4.PasswordChar = '*'; // 設置textBox4的密碼字符this.textBox4.Size = new Size(223, 21); // 設置textBox4的大小this.textBox4.TabIndex = 7; // 設置textBox4的Tab索引// // label4// this.label4.Location = new Point(8, 170); // 設置label4的位置this.label4.Name = "label4"; // 設置label4的名稱this.label4.Size = new Size(104, 16); // 設置label4的大小this.label4.TabIndex = 6; // 設置label4的Tab索引this.label4.Text = "重復設定的密碼:"; // 設置label4的文本// // textBox3// this.textBox3.Location = new Point(120, 123); // 設置textBox3的位置this.textBox3.Name = "textBox3"; // 設置textBox3的名稱this.textBox3.PasswordChar = '*'; // 設置textBox3的密碼字符this.textBox3.Size = new Size(223, 21); // 設置textBox3的大小this.textBox3.TabIndex = 5; // 設置textBox3的Tab索引// // label3// this.label3.Location = new Point(8, 131); // 設置label3的位置this.label3.Name = "label3"; // 設置label3的名稱this.label3.Size = new Size(128, 16); // 設置label3的大小this.label3.TabIndex = 4; // 設置label3的Tab索引this.label3.Text = "設定密碼(大于6位):"; // 設置label3的文本// // textBox2// this.textBox2.Location = new Point(120, 80); // 設置textBox2的位置this.textBox2.Name = "textBox2"; // 設置textBox2的名稱this.textBox2.Size = new Size(223, 21); // 設置textBox2的大小this.textBox2.TabIndex = 3; // 設置textBox2的Tab索引// // label2// this.label2.Location = new Point(8, 85); // 設置label2的位置this.label2.Name = "label2"; // 設置label2的名稱this.label2.Size = new Size(104, 16); // 設置label2的大小this.label2.TabIndex = 2; // 設置label2的Tab索引this.label2.Text = "加密輸出文件名:"; // 設置label2的文本// // textBox1// this.textBox1.BackColor = SystemColors.Control; // 設置textBox1的背景顏色this.textBox1.Location = new Point(120, 34); // 設置textBox1的位置this.textBox1.Name = "textBox1"; // 設置textBox1的名稱this.textBox1.ReadOnly = true; // 設置textBox1為只讀模式this.textBox1.Size = new Size(223, 21); // 設置textBox1的大小this.textBox1.TabIndex = 1; // 設置textBox1的Tab索引// // label1// this.label1.Location = new Point(8, 37); // 設置label1的位置this.label1.Name = "label1"; // 設置label1的名稱this.label1.Size = new Size(96, 16); // 設置label1的大小this.label1.TabIndex = 0; // 設置label1的Tab索引this.label1.Text = "被加密文件名:"; // 設置label1的文本// // groupBox2// this.groupBox2.Controls.Add(this.button3); // 將button3添加到groupBox2中this.groupBox2.Controls.Add(this.button4); // 將button4添加到groupBox2中this.groupBox2.Controls.Add(this.textBox6); // 將textBox6添加到groupBox2中this.groupBox2.Controls.Add(this.label6); // 將label6添加到groupBox2中this.groupBox2.Controls.Add(this.textBox7); // 將textBox7添加到groupBox2中this.groupBox2.Controls.Add(this.label7); // 將label7添加到groupBox2中this.groupBox2.Controls.Add(this.textBox8); // 將textBox8添加到groupBox2中this.groupBox2.Controls.Add(this.label8); // 將label8添加到groupBox2中this.groupBox2.Location = new Point(38, 272); // 設置groupBox2的位置this.groupBox2.Name = "groupBox2"; // 設置groupBox2的名稱this.groupBox2.Size = new Size(509, 198); // 設置groupBox2的大小this.groupBox2.TabIndex = 1; // 設置groupBox2的Tab索引this.groupBox2.TabStop = false; // 設置groupBox2是否顯示邊框this.groupBox2.Text = "解密文件設置"; // 設置groupBox2的標題文本// // button3// this.button3.Location = new Point(322, 136); // 設置button3的位置this.button3.Name = "button3"; // 設置button3的名稱this.button3.Size = new Size(80, 23); // 設置button3的大小this.button3.TabIndex = 9; // 設置button3的Tab索引this.button3.Text = "解密文件"; // 設置button3的文本this.button3.Click += new EventHandler(this.button3_Click); // 綁定button3的點擊事件處理程序// // button4// this.button4.Location = new Point(223, 136); // 設置button4的位置this.button4.Name = "button4"; // 設置button4的名稱this.button4.Size = new Size(80, 23); // 設置button4的大小this.button4.TabIndex = 8; // 設置button4的Tab索引this.button4.Text = "瀏覽文件"; // 設置button4的文本this.button4.Click += new EventHandler(this.button4_Click); // 綁定button4的點擊事件處理程序// // textBox6// this.textBox6.Location = new Point(97, 136); // 設置textBox6的位置this.textBox6.Name = "textBox6"; // 設置textBox6的名稱this.textBox6.PasswordChar = '*'; // 設置textBox6的密碼字符this.textBox6.Size = new Size(120, 21); // 設置textBox6的大小this.textBox6.TabIndex = 5; // 設置textBox6的Tab索引// // label6// this.label6.Location = new Point(19, 139); // 設置label6的位置this.label6.Name = "label6"; // 設置label6的名稱this.label6.Size = new Size(72, 16); // 設置label6的大小this.label6.TabIndex = 4; // 設置label6的Tab索引this.label6.Text = "輸入密碼:"; // 設置label6的文本// // textBox7// this.textBox7.Location = new Point(120, 93); // 設置textBox7的位置this.textBox7.Name = "textBox7"; // 設置textBox7的名稱this.textBox7.Size = new Size(282, 21); // 設置textBox7的大小this.textBox7.TabIndex = 3; // 設置textBox7的Tab索引// // label7// this.label7.Location = new Point(19, 96); // 設置label7的位置this.label7.Name = "label7"; // 設置label7的名稱this.label7.Size = new Size(104, 16); // 設置label7的大小this.label7.TabIndex = 2; // 設置label7的Tab索引this.label7.Text = "解密輸出文件名:"; // 設置label7的文本// // textBox8// this.textBox8.BackColor = SystemColors.Control; // 設置textBox8的背景顏色this.textBox8.Location = new Point(120, 50); // 設置textBox8的位置this.textBox8.Name = "textBox8"; // 設置textBox8的名稱this.textBox8.ReadOnly = true; // 設置textBox8為只讀模式this.textBox8.Size = new Size(282, 21); // 設置textBox8的大小this.textBox8.TabIndex = 1; // 設置textBox8的Tab索引// // label8// this.label8.Location = new Point(19, 53); // 設置label8的位置this.label8.Name = "label8"; // 設置label8的名稱this.label8.Size = new Size(96, 16); // 設置label8的大小this.label8.TabIndex = 0; // 設置label8的Tab索引this.label8.Text = "被解密文件名:"; // 設置label8的文本// // openFileDialog1// this.openFileDialog1.FileName = "openFileDialog1"; // 設置openFileDialog1的默認文件名// // Form1// this.AutoScaleBaseSize = new Size(6, 14); // 設置窗體自動縮放的基本大小this.ClientSize = new Size(587, 500); // 設置窗體的客戶區大小this.Controls.Add(this.groupBox2); // 將groupBox2添加到窗體中this.Controls.Add(this.groupBox1); // 將groupBox1添加到窗體中this.Name = "Form1"; // 設置窗體的名稱this.StartPosition = FormStartPosition.CenterScreen; // 設置窗體啟動位置為中心屏幕this.Text = "文件加密解密工具"; // 設置窗體的標題文本this.groupBox1.ResumeLayout(false); // 恢復groupBox1布局邏輯this.groupBox1.PerformLayout(); // 執行groupBox1的布局邏輯this.groupBox2.ResumeLayout(false); // 恢復groupBox2布局邏輯this.groupBox2.PerformLayout(); // 執行groupBox2的布局邏輯this.ResumeLayout(false); // 恢復Form1布局邏輯}#endregion// 處理“瀏覽文件”按鈕點擊事件(加密)private void button1_Click(object sender, EventArgs e){if (openFileDialog1.ShowDialog() == DialogResult.OK) // 顯示打開文件對話框并檢查結果{textBox1.Text = openFileDialog1.FileName; // 設置textBox1的文本為選定的文件路徑}}// 處理“加密文件”按鈕點擊事件private void button2_Click(object sender, EventArgs e){string inputFile = textBox1.Text; // 獲取被加密文件的路徑string outputFile = textBox2.Text; // 獲取加密后文件的路徑string password = textBox3.Text; // 獲取設定的密碼string confirmPassword = textBox4.Text; // 獲取確認的密碼if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password)){MessageBox.Show("請輸入所有必要的信息。"); // 提示用戶輸入所有必要信息return;}if (password.Length < 6){MessageBox.Show("密碼必須至少6位。"); // 提示密碼長度不足return;}if (password != confirmPassword){MessageBox.Show("兩次輸入的密碼不一致。"); // 提示密碼不一致return;}try{EncryptFile(inputFile, outputFile, password); // 調用加密文件的方法MessageBox.Show("文件已成功加密。"); // 提示文件加密成功}catch (Exception ex){MessageBox.Show( $ "加密失敗: {ex.Message}"); // 提示加密失敗并顯示錯誤信息 } } // 處理“瀏覽文件”按鈕點擊事件(解密) private void button4_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) // 顯示打開文件對話框并檢查結果 { textBox8.Text = openFileDialog1.FileName; // 設置textBox8的文本為選定的文件路徑 } } // 處理“解密文件”按鈕點擊事件 private void button3_Click(object sender, EventArgs e) { string inputFile = textBox8.Text; // 獲取被解密文件的路徑 string outputFile = textBox7.Text; // 獲取解密后文件的路徑 string password = textBox6.Text; // 獲取輸入的密碼 if (string.IsNullOrEmpty(inputFile) || string.IsNullOrEmpty(outputFile) || string.IsNullOrEmpty(password)) { MessageBox.Show("請輸入所有必要的信息。"); // 提示用戶輸入所有必要信息 return; } try { DecryptFile(inputFile, outputFile, password); // 調用解密文件的方法 MessageBox.Show("文件已成功解密。"); // 提示文件解密成功 } catch (Exception ex) { MessageBox.Show( $ "解密失敗: {ex.Message}"); // 提示解密失敗并顯示錯誤信息}}// 文件加密方法private void EncryptFile(string inputFile, string outputFile, string password){using (FileStream inputStream = File.OpenRead(inputFile), outputStream = File.Create(outputFile)){byte[] salt = GenerateSalt(); // 生成鹽值RijndaelManaged rijndael = new RijndaelManaged();rijndael.KeySize = 256;rijndael.BlockSize = 128;PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8);rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8);outputStream.Write(salt, 0, salt.Length); // 寫入鹽值到輸出流CryptoStream cryptoStream = new CryptoStream(outputStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write);inputStream.CopyTo(cryptoStream); // 將輸入流復制到加密流cryptoStream.FlushFinalBlock(); // 刷新加密流}}// 文件解密方法private void DecryptFile(string inputFile, string outputFile, string password){using (FileStream inputStream = File.OpenRead(inputFile), outputStream = File.Create(outputFile)){byte[] salt = new byte[16]; // 創建一個數組來存儲鹽值inputStream.Read(salt, 0, salt.Length); // 從輸入流中讀取鹽值RijndaelManaged rijndael = new RijndaelManaged();rijndael.KeySize = 256;rijndael.BlockSize = 128;PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt);rijndael.Key = pdb.GetBytes(rijndael.KeySize / 8);rijndael.IV = pdb.GetBytes(rijndael.BlockSize / 8);CryptoStream cryptoStream = new CryptoStream(inputStream, rijndael.CreateDecryptor(), CryptoStreamMode.Read);cryptoStream.CopyTo(outputStream); // 將解密流復制到輸出流}}// 生成鹽值的方法private byte[] GenerateSalt(){RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider();byte[] salt = new byte[16];rngCsp.GetBytes(salt); // 使用隨機數生成器填充鹽值return salt;}} }