此为本人两年前写的博客,算是实习期的留念了
-------------------------------------------割--------------------------------------------------
本人真心菜鸟一枚,还在实习,属于那种大学纯玩过来的(现在想想挺后悔的= =),学校教的东西不是很多,但我能记住还能自己弄弄的也就只有WinForm了。
开始实习以后感觉进状态了,每天都在接任务、敲代码、各种百度各种看书各种跟前辈请教中度过,知识在进步的感觉真心很爽,敲代码的兴趣也大大增加了。
之前一阵公司不忙所以就暂时闲了下来,就想着接着弄弄WinForm吧,主要是因为就这个还熟一点啊。之前就一直觉得现在好多地方都需要注册,用户名密码什么的真心太多了,全弄成一样的吧,总怕不太安全,弄成不一样的吧真心太多了,记在纸上又怕弄丢。于是乎就想着弄一个存账户密码的东西(虽然后来也写了别的功能),但这东西始终是有安全问题的啊,最后决定用到DES加密来完成存储。一条存储记录包括位置(就是哪个论坛或者哪个网站)、用户名和密码,本来想着存到数据库里一想不对,不可能谁都往自己电脑里装个数据库啊。但是本人还没熟悉XML…..所以就选择了存到txt文件中。
个人觉的这种方法的好处在于以前你需要记很多的账号和密码,而现在你只需要记住一条8位密钥就足够了。(不过这个都忘了的话就真没辙了……)
存储部分
存储的逻辑就是在存储界面输入位置、用户名和密码以后还需设定一个8位字母数字组成的密钥,再点击存储后位置和用户名直接存进txt文件,而密码会用密钥和后台加密规则加密后再存进txt文件,以此来完成一条记录的存储。而填写的密钥也会被后台规则加密后存在另一个txt文件中以备提取时使用。
提取部分
提取的逻辑就是在提取界面有一下拉框,里面有所有的位置信息,当选择其中一条后点击提取按钮会显示出用户名和加密后的密码,然后再输入之前的密钥进行解密,就可以得到自己的用户名和密码了。
接下来给大家展示一下使用过程:先是在存储界面将所有信息填写好
然后点击存入,如果是第一次存储,系统会将密钥存入txt文件并设为默认密钥,之后再存储的话就不需要再进行输入了。存储成功后会在目标文件中以[位置用户名&密码]将信息存入,存储成功后位置用户密码文本信息为:TestLocationTestName&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/p/4616792.html
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利。