CQ-CSER

计算机爱好者

随笔-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 &lt; 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 &lt; 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 &lt; bytes.Length; i++)
            {
                int b = bytes[i];
                chars[i * 2] = hexDigits[b &gt;&gt; 4];
                chars[i * 2 + 1] = hexDigits[b &amp; 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

相关文章:

  1. ASP.NET加密Cookies
  2. app.config-c#读写类
  3. DES加密解密函数 收藏 c#
  4. string和byte[]的相互(C#)
  5. C#的加密解密算法,包括Silverlight的MD5算法

评论|Comments

3 Responses to “随笔-MD5悲剧-c#”

  1. cq
    四月 26th, 2010 @ 23:42

    sourcecode
    pre
    两个用法
    http://bbs.ahu.edu.cn

  2. 迷途的牧師
    四月 29th, 2010 @ 03:43

    研究颇深嘛。

  3. SEO-小康- SEO-Skyer
    八月 4th, 2010 @ 08:46

    随笔…

    I found your entry interesting thus I’ve added a Trackback to it on my weblog :)

留言|Leave a Reply





  • Archives

  • SUNSHINE

  • About

    本博客采用创作共用版权协议,要求署名、非商业用途和保持一致. 转载本博客内容也遵循“署名-非商业用途-保持一致”的创作共用协议.

    订阅

    Search

    Admin