创建基本的MD5字典

时间:2014-01-17 17:35:37

标签: c# dictionary hash md5

我正在尝试制作一个从1位到3位长的字典,其中包含a,b,c,d,... 7,8,9; aa,bb,cc,dd,...,77,88,99& aaa,bbb,... 888,999 MD5哈希函数并将其存储在SQL中。我尝试使用3作为嵌套循环来填充我的sql列-palintext和MD5哈希列 - 我对C#很新,这就是我测试的;我对这段代码有严重的问题。正确的表格应该如何,我该如何编辑呢?

我试过了:

private void button1_Click(object sender, EventArgs e)
{

  var list = "abcdefghijklmnopqrstuvwxyz0123456789".ToString();

  for ( int i = 0 ; i < list.Length ; i++ )
  {

    com.Connection = con;
    com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash) values(@PlainText,@MD5Hash)";
    com.Parameters.AddWithValue("@PlainText", List);
    com.Parameters.AddWithValue("@MD5Hash", md[List]);
    MessageBox.Show(com.ExecuteNonQuery().ToString());

    for (int j = 0; j < list.Length; j++)
    {

      com.Connection = con;
      com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash) values(@PlainText,@MD5Hash)";
      com.Parameters.AddWithValue("@PlainText", List);
      com.Parameters.AddWithValue("@MD5Hash", md[List]);
      MessageBox.Show(com.ExecuteNonQuery().ToString());

      for (int k = 0; k < list.Length; k++)
      {
        com.Connection = con;
        com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash) values(@PlainText,@MD5Hash)";
        com.Parameters.AddWithValue("@PlainText", List);
        com.Parameters.AddWithValue("@MD5Hash", md[List]);
        MessageBox.Show(com.ExecuteNonQuery().ToString());
      }
    }
  }
}

public string md(string input)
{
  MD5 md5 = MD5.Create();
  byte[] inputBytes = Encoding.UTF8.GetBytes(input);
  byte[] hash = md5.ComputeHash(inputBytes);  

  string sb;
  sb = "";

  for (int i = 0; i < hash.Length; i++)
  {
    sb  += hash[i].ToString("X2");
  }
  return sb;
}
}
}

2 个答案:

答案 0 :(得分:0)

此代码甚至无法编译。

什么是(var[]List)?您的意思是list吗?

此声明:var[] list = "abcdefghijklmnopqrstuvwxyz0123456789".ToString();应为var list = "abcdefghijklmnopqrstuvwxyz0123456789".ToString();

此声明com.CommandText = "insert into CryptographyTable(PlainText,MD5Hash)没有结束双引号或分号。

答案 1 :(得分:0)

建造彩虹桌,是吗?

您需要了解问题分解的概念。将问题分解成更小,更简单的部分使事情变得更加简单。

首先,您需要一种方法将数据插入彩虹表:

static void InsertIntoDb( string key , string value )
{
  string connectString = "your-connect-string-here" ;
  Func<string,string> qt = s => s.Replace("'" , "''") ;
  using( SqlConnection sql = new SqlConnection(connectString) )
  using ( SqlCommand    cmd = sql.CreateCommand() )
  {
    cmd.CommandText = string.Format( @"insert dbo.RainbowTable( md5 , text ) values ( '{0}' , '{1}' )" , qt(key) , qt(value) ) ;
    cmd.CommandType = CommandType.Text;
    sql.Open();
    cmd.ExecuteNonQuery() ;
    sql.Close() ;
  }
  return ;
}

然后你需要一个方法来计算一段文本的MD5哈希并返回一个包含其十六进制表示的字符串:

static string ComputeMd5Hash( string s , Encoding e )
{
  MD5 md5       = MD5.Create() ;
  byte[] octets = e.GetBytes(s) ;
  byte[] hash   = md5.ComputeHash(octets) ;
  string hex    = "0x" + hash.Aggregate( new StringBuilder("0x") , (sb,x) => sb.Append(x) ).ToString() ;
  return hex ;
}

最后,你需要一个方法来生成你需要的字符串(**提示: recursion 的概念在这里可能很有用。)

static IEnumerable<string> GetStringsToBeHashed()
{
  // your string generation code here
}

这些作品中的每一件都只做一件事,易于构建且易于测试。

一旦你掌握了所有的部件,那就很容易把它们放在一起了:

foreach ( string s in GetStringsToBeHashed() )
{
  string hash = ComputeMd5Hash(s,Encoding.UTF8) ;
  InsertIntoDb( hash, s ) ;
}