随笔-MD5悲剧-c#
Posted on | 四月 25, 2010 | 3 Comments
图书馆对面的2小情侣给了我动力,终于搞定了课设,今晚又尝试了下MD5加解密文件系统密码,网上找了个MD5类如下,结果就悲剧了
using System;
using System.Text;
using System.IO;
using System.Globalization;
using System.Security.Cryptography;</code>// 创建Key
public string GenerateKey()
{
DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();
return ASCIIEncoding.ASCII.GetString(desCrypto.Key);
}
// 加密字符串
public string EncryptString(string sInputString, string sKey)
{
byte [] data = Encoding.UTF8.GetBytes(sInputString);
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
namespace MyFileBrowser
{
public class MD5
{
///MD5加密
public string MD5Encrypt(string pToEncrypt, string sKey)
{
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, md5.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
foreach (byte b in ms.ToArray())
{
ret.AppendFormat("{0:X2}", b);
}
ret.ToString();
return ret.ToString();
}
///MD5解密
public string MD5Decrypt(string pToDecrypt, string sKey)
{
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
for (int x = 0; x < pToDecrypt.Length / 2; x++)
{
int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
inputByteArray[x] = (byte)i;
}
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, md5.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
StringBuilder ret = new StringBuilder();
return System.Text.Encoding.Default.GetString(ms.ToArray());
}
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = md5.CreateEncryptor();
byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return BitConverter.ToString(result);
}
// 解密字符串
public string DecryptString(string sInputString, string sKey)
{
string [] sInput = sInputString.Split("-".ToCharArray());
byte [] data = new byte[sInput.Length];
for(int i = 0; i < sInput.Length; i++)
{
data[i] = byte.Parse(sInput[i], NumberStyles.HexNumber);
}
DESCryptoServiceProvider md5 = new DESCryptoServiceProvider();
md5.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
md5.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
ICryptoTransform desencrypt = md5.CreateDecryptor();
byte [] result = desencrypt.TransformFinalBlock(data, 0, data.Length);
return Encoding.UTF8.GetString(result);
}
}
/*
class Test
{
static void Main()
{
bool sy = true;
char a;
MD5 md5 = new MD5();
string key = md5.GenerateKey();
string s0 = " microsoft ";
string s1 = md5.EncryptString(s0, key);
string s2 = md5.DecryptString(s1, key);
Console.WriteLine("原串: [{0}]", s0);
Console.WriteLine("加密: [{0}]", s1);
Console.WriteLine("解密: [{0}]", s2);
while (sy)
{
Console.WriteLine("是否输入字符串? Y/N");
a = Convert.ToChar(Console.ReadLine());
if ( a == 'Y' || a == 'y')
{
sy = true;
Console.WriteLine(" 请输入所要验证的字符串 ");
s0 = Console.ReadLine();
s1 = md5.EncryptString(s0, key);
s2 = md5.DecryptString(s1, key);
Console.WriteLine("原串: [{0}]", s0);
Console.WriteLine("加密: [{0}]", s1);
Console.WriteLine("解密: [{0}]", s2);
}
else
if (a == 'N' || a == 'n')
sy = false;
else
Console.WriteLine(" 您一定输错了,请重新输入 !");
}
}
}
*/
}
被我注销掉的是错误引用,悲剧就从这开始了,他调用了的是子函数,于是我试着在BYTE[]和STRING之间做各种转换,搞完了发现我就是把原函数简略的写了遍,下面是MSDN的例子和一些
<span style="COLOR: blue">byte</span>[] bytes = { 0, 1, 14, 168, 255 };
<span style="COLOR: blue">foreach</span> (<span style="COLOR: blue">byte</span> byteValue <span style="COLOR: blue">in</span> bytes)
outputBlock.Text += byteValue + <span style="COLOR: #a31515">"\n"</span>;
<span style="COLOR: green">// The example displays the following output if the current</span>
<span style="COLOR: green">// culture is en-US:</span>
<span style="COLOR: green">// 0</span>
<span style="COLOR: green">// 1</span>
<span style="COLOR: green">// 14</span>
<span style="COLOR: green">// 168</span>
<span style="COLOR: green">// 255</span>
#region BYTE转换STRING
/* static char[] hexDigits = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public static string ToHexString(byte[] bytes)
{
char[] chars = new char[bytes.Length * 2];
for (int i = 0; i < bytes.Length; i++)
{
int b = bytes[i];
chars[i * 2] = hexDigits[b >> 4];
chars[i * 2 + 1] = hexDigits[b & 0xF];
}
return new string(chars);
}*/
#endregion
-----------------------------------------------------------------------------------------
最后上我的最终代码:
#region 修改密码
public void changepsw()
{
MD5 md6 = new MD5();
// readoutkey = md5.GenerateKey();//调用产生函数
//byte[] mykey = System.Text.Encoding.UTF8.GetBytes(readoutkey);
//string finkey = ToHexString(mykey); //MD5公匙转换成HEXstring形式方便保存
byte[] chang = HexToByte(readoutkey);//读出的HEXstring格式转换成BYTE
string changs = System.Text.Encoding.Default.GetString(chang);// 转换成密匙格式
// password = md6.MD5Encrypt("123456", changs);
temp = md6.MD5Decrypt(password,changs);
if (string.Compare(_txtInfo.Text,temp, true) == 0)
{
AboutBox1 MyDialog = new AboutBox1();
MyDialog.Text = "输入密码";
if (MyDialog.ShowDialog() == DialogResult.OK)
{
MessageBox.Show("您输入的值是:" + MyDialog.textBox1.Text, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
password = MyDialog.textBox1.Text;
password = md6.MD5Encrypt(password,changs);
byte[] tem = System.Text.Encoding.UTF8.GetBytes(password);
string finpass= ToHexString(tem);
ConfigAppSettings.SetValue("DemoKey", finpass);
// ConfigAppSettings.SetValue("stry",readoutkey);已有密匙
}
else
{
MessageBox.Show("操作被取消", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
MyDialog.Dispose();
}
else MessageBox.Show("在下面文本框中输入正确密码");
}
#endregion<php>
整个SLN,VS2010U版的
http://cq-cser.cn/wp-content/plugins/downloads-manager/upload/MyFileBrowser.rar
相关文章:
- ASP.NET加密Cookies
- app.config-c#读写类
- DES加密解密函数 收藏 c#
- string和byte[]的相互(C#)
- C#的加密解密算法,包括Silverlight的MD5算法
评论|Comments
3 Responses to “随笔-MD5悲剧-c#”
留言|Leave a Reply
![如果您自认为是一位忠实的Silverlight-Fans,那么请将此标志放到您的博客中成为一名真正的[银光使者]](http://images.cnblogs.com/cnblogs_com/alamiye010/Silverlighter1.jpg)
四月 26th, 2010 @ 23:42
sourcecode
pre
两个用法
http://bbs.ahu.edu.cn
四月 29th, 2010 @ 03:43
研究颇深嘛。
八月 4th, 2010 @ 08:46
随笔…
I found your entry interesting thus I’ve added a Trackback to it on my weblog
…