本人真心菜鳥一枚,還在實習,屬於那種大學純玩過來的(現在想想挺后悔的= =),學校教的東西不是很多,但我能記住還能自己弄弄的也就只有WinForm了。
開始實習以后感覺進狀態了,每天都在接任務、敲代碼、各種百度各種看書各種跟前輩請教中度過,知識在進步的感覺真心很爽,敲代碼的興趣也大大增加了。
---------------------------------------------------------------割----------------------------------------------------------------------
之前一陣公司不忙所以就暫時閑了下來,就想着接着弄弄WinForm吧,主要是因為就這個還熟一點啊。之前就一直覺得現在好多地方都需要注冊,用戶名密碼什么的真心太多了,全弄成一樣的吧,總怕不太安全,弄成不一樣的吧真心太多了,記在紙上又怕弄丟。於是乎就想着弄一個存賬戶密碼的東西(雖然后來也寫了別的功能),但這東西始終是有安全問題的啊,最后決定用到DES加密來完成存儲。一條存儲記錄包括位置(就是哪個論壇或者哪個網站)、用戶名和密碼,本來想着存到數據庫里一想不對,不可能誰都往自己電腦里裝個數據庫啊。但是本人還沒熟悉XML.....所以就選擇了存到txt文件中。
個人覺的這種方法的好處在於以前你需要記很多的賬號和密碼,而現在你只需要記住一條8位密鑰就足夠了。(不過這個都忘了的話就真沒轍了......)
存儲部分
存儲的邏輯就是在存儲界面輸入位置、用戶名和密碼以后還需設定一個8位字母數字組成的密鑰,再點擊存儲后位置和用戶名直接存進txt文件,而密碼會用密鑰和后台加密規則加密后再存進txt文件,以此來完成一條記錄的存儲。而填寫的密鑰也會被后台規則加密后存在另一個txt文件中以備提取時使用。

提取部分
提取的邏輯就是在提取界面有一下拉框,里面有所有的位置信息,當選擇其中一條后點擊提取按鈕會顯示出用戶名和加密后的密碼,然后再輸入之前的密鑰進行解密,就可以得到自己的用戶名和密碼了。

---------------------------------------------------------------再割----------------------------------------------------------------------
接下來給大家展示一下使用過程:
先是在存儲界面將所有信息填寫好
然后點擊存入,如果是第一次存儲,系統會將密鑰存入txt文件並設為默認密鑰,之后再存儲的話就不需要再進行輸入了。存儲成功后會在目標文件中以[位置*用戶名&密碼]將信息存入,存儲成功后位置用戶密碼文本信息為:TestLocation*TestName&zbvVfu5PR4o=。
然后是提取剛剛存入的這條記錄,在提取界面下拉框選擇剛剛的位置
選擇好后點擊提取按鈕,得到用戶名與加密后的密碼
然后再將正確的密鑰進行輸入並完成解密就可以得到正確的密碼了
到這兒就是功能的全部了。
因為也寫了別的東西,代碼就不全貼了,以下會把關鍵部分的代碼貼出來:
#region 存儲按鈕
private void btn_Encrypt_Click(object sender, EventArgs e)
{
if (txt_SaveName.Text == "" || txt_SavePassword.Text == "" || txt_SaveLocation.Text == "")
{
MessageBox.Show("請將基本存儲信息填寫完整");
}
else
{
if (txt_SaveKey.Text == "")
{
if (lbl_OldKey.Text == "")
{
MessageBox.Show("請填寫加密秘鑰");
}
else
{
MessageBox.Show("系統將使用默認秘鑰");
Save(txt_SaveLocation.Text, txt_SaveName.Text, Encrypting(txt_SavePassword.Text.Trim(), lbl_OldKey.Text.Trim()));
}
}
else
{
if (lbl_OldKey.Text == "")
{
DialogResult dr = MessageBox.Show("是否確定使用此秘鑰,執行后系統將設置為默認", "秘鑰設置", MessageBoxButtons.YesNo);
if (dr == DialogResult.Yes)
{
ChangeKeyPassword = Encrypting(txt_SaveKey.Text.Trim(), InitialKey);
//將默認秘鑰存入文件
FileStream fs = new FileStream(@".\Key.txt", FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(ChangeKeyPassword);
sw.Close();
fs.Close();
lbl_OldKey.Text = txt_SaveKey.Text.Trim();
Save(txt_SaveLocation.Text, txt_SaveName.Text, Encrypting(txt_SavePassword.Text.Trim(), txt_SaveKey.Text.Trim()));
}
else
{
MessageBox.Show("請重新設置密鑰");
}
}
else
{
MessageBox.Show("已存在默認秘鑰,無法進行替換");
}
}
}
}
#endregion
#region 加密過程
public string Encrypting(string entryptString, string key)
{
byte[] rgbKey = Encoding.UTF8.GetBytes(key);
byte[] rgbIV = keys;
byte[] inputByteArray = Encoding.UTF8.GetBytes(entryptString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Convert.ToBase64String(mStream.ToArray());
}
#endregion
#region 解密過程
public string Deciphering(string decipherString, string key)
{
byte[] rgbKey = Encoding.UTF8.GetBytes(key);
byte[] rgbIV = keys;
byte[] inputByteArray = Convert.FromBase64String(decipherString);
DESCryptoServiceProvider dCSP = new DESCryptoServiceProvider();
MemoryStream mStream = new MemoryStream();
CryptoStream cStream = new CryptoStream(mStream, dCSP.CreateDecryptor(rgbKey, rgbIV), CryptoStreamMode.Write);
cStream.Write(inputByteArray, 0, inputByteArray.Length);
cStream.FlushFinalBlock();
return Encoding.UTF8.GetString(mStream.ToArray());
}
#endregion
#region 讀取賬號位置
public void ReadData()
{
int lineLength = lineIndex(@".\UserPassword.txt");
FileStream fs = new FileStream(@".\UserPassword.txt", FileMode.Open);
StreamReader sr = new StreamReader(fs);
string LineContent;
for (int line = 0; line < lineLength; line++)
{
if ((LineContent = sr.ReadLine()) != null)
{
int number = LineContent.IndexOf("*");
string item = LineContent.Substring(0, number);
cbo_GetPosition.Items.Add(item);
}
else
{
cbo_GetPosition.Items.Clear();
}
}
sr.Close();
fs.Close();
}
#endregion
#region 解密按鈕
private void btn_decipher_Click(object sender, EventArgs e)
{
if (txt_GetPassword.Text == "")
{
MessageBox.Show("請先查詢出密碼,再進行解密");
}
else
{
if (txt_GetKey.Text == "")
{
MessageBox.Show("請填入解密秘鑰");
}
else
{
if (lbl_OldKey.Text == "")
{
MessageBox.Show("還未設置默認密鑰");
}
else
{
if (lbl_OldKey.Text == txt_GetKey.Text)
{
getpassword = Deciphering(txt_GetPassword.Text, lbl_OldKey.Text);
txt_GetPassword.Text = getpassword;
MessageBox.Show("解密完成");
btn_decipher.Enabled = false;
}
else
{
MessageBox.Show("密鑰錯誤");
}
}
}
}
}
#endregion
我也知道這個功能可能也就是大學實訓課作業的等級,求別損.......,之所以寫出來跟大家分享,一是自己寫出來自己想寫的東西滿足感爆棚(嘿嘿),二是想讓高手們看看是不是有哪兒可以改進,邏輯上是不是有問題,或者這種方式是不是不太安全,希望大神們能不吝賜教啊,感激不盡!
作者:emsui
出處:http://www.cnblogs.com/WYD524/
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
