[C# WinForm] 使用3DES 及金鑰加密及解密

現在在執行系統時,通常會有一些比較機密的資料,例如資料庫連線資訊,跨系統交換的訊息,
這些資訊通常都是比較需要保護的資訊,以避免有心人想要知道內容,進而入侵系統造成資訊外流,
而系統設定常用的資料庫連線資訊,也是需要被保護的資訊,避免可以瀏覽檔案權限的人,看到資料庫的連線資料。
這時候建議做一個加解密的小工具來轉換保護的資訊。
而我使用的加解密是3DES機制,他是舊DES 加解密的升級版,舊有的DES 加密邏輯太過於簡單,硬性破解很快就會被解開,所以建議使用新的機制。
接下來會使用一個WinForm 來講解。

先看看做出來的成果


在來源字串輸入明碼資料,例如: MyPassword
再來輸入加密鑰匙,例如: 123456781234567812345678
這個加密鑰匙需要長度為24碼,這是3DES的加密鑰匙要求,
需要你自行定義你自己的加密鑰密,並安全的保存起來,避免讓別人知道你的加解密鑰匙,
執行「加密」功能後,就會得到結果值為: Qes2jTTlA+oChVMoaQOVFQ==
而這個加密結果就是可以傳輸或是保留在檔案的資料,就算別人看到,也看不懂實際上的值是什麼,多一份保障。

再看一下解密還原的結果

將剛剛的加密結果,複製到來源字串,例如: Qes2jTTlA+oChVMoaQOVFQ==
加密鑰匙一樣輸入: 123456781234567812345678,需要使用和加密同樣的鑰匙喔,
再來按一下「解密」,就可以還原原始的資料了,就會看到值為: MyPassword。
加密鑰匙一定要一樣,鑰匙不對的話,就會解密失敗,或是解密成不同的值。

原始碼畫面設定

加密程式碼說明

private void btnEncoding_Click(object sender, EventArgs e)
{
	// 輸入來源檢查
	if (txtSource.Text.Trim().Length == 0)
	{
		MessageBox.Show("請輸入來源字串");
		return;
	}
	if (txtKey.Text .Trim ().Length == 0)
	{
		MessageBox.Show("請輸入加密鑰匙");
		return;
	}
	if (txtKey.Text.Trim().Length != 24)
	{
		MessageBox.Show("加密鑰匙長度需為24碼");
		return;
	}

	try
	{
		// 呼叫加密
		string result = this.Encrypt3DES(txtSource.Text, txtKey.Text);
		txtResult.Text = result;
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

/// <summary>
/// 使用3DES加密
/// </summary>
/// <param name="strSource"></param>
/// <param name="strKey">長度為24字元</param>
/// <returns></returns>
public  string Encrypt3DES(string strSource, string strKey)
{
	TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
	DES.Key = UTF8Encoding.UTF8.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strKey, "md5").Substring(0, 24));
	DES.Mode = CipherMode.ECB;
	ICryptoTransform DESEncrypt = DES.CreateEncryptor();
	byte[] Buffer = UTF8Encoding.UTF8.GetBytes(strSource);
	return Convert.ToBase64String(DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
}

這是執行「加密」的程式碼,程式將回傳結果顯示在畫面上。
重點就是Encrypt3DES 的方法,傳入必要的參數就行。

解密程式碼說明

private void btnDecoding_Click(object sender, EventArgs e)
{
	// 輸入來源檢查
	if (txtSource.Text.Trim().Length == 0)
	{
		MessageBox.Show("請輸入來源字串");
		return;
	}
	if (txtKey.Text.Trim().Length == 0)
	{
		MessageBox.Show("請輸入加密鑰匙");
		return;
	}
	if (txtKey.Text.Trim().Length != 24)
	{
		MessageBox.Show("加密鑰匙長度需為24碼");
		return;
	}
	try
	{
		// 呼叫解密
		string result = this.Decrypt3DES(txtSource.Text, txtKey.Text);
		txtResult.Text = result;
	}
	catch (Exception ex)
	{
		MessageBox.Show(ex.Message);
	}
}

/// <summary>
/// 使用3DES解密
/// </summary>
/// <param name="strEncryptData"></param>
/// <param name="strKey">長度為24字元/param>
/// <returns></returns>
public  string Decrypt3DES(string strEncryptData, string strKey)
{
	TripleDESCryptoServiceProvider DES = new TripleDESCryptoServiceProvider();
	DES.Key = UTF8Encoding.UTF8.GetBytes(System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(strKey, "md5").Substring(0, 24));
	DES.Mode = CipherMode.ECB;
	DES.Padding = System.Security.Cryptography.PaddingMode.PKCS7;
	ICryptoTransform DESDecrypt = DES.CreateDecryptor();
	string result = "";
	byte[] Buffer = Convert.FromBase64String(strEncryptData);
	result = UTF8Encoding.UTF8.GetString(DESDecrypt.TransformFinalBlock(Buffer, 0, Buffer.Length));
	return result;
}

重點就是Decrypt3DES 的方法,傳入必要的參數就行。