現在在執行系統時,通常會有一些比較機密的資料,例如資料庫連線資訊,跨系統交換的訊息,
這些資訊通常都是比較需要保護的資訊,以避免有心人想要知道內容,進而入侵系統造成資訊外流,
而系統設定常用的資料庫連線資訊,也是需要被保護的資訊,避免可以瀏覽檔案權限的人,看到資料庫的連線資料。
這時候建議做一個加解密的小工具來轉換保護的資訊。
而我使用的加解密是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 的方法,傳入必要的參數就行。