【问题标题】:C# bruteforce md5 hashed stringC# bruteforce md5 散列字符串
【发布时间】:2015-01-29 09:00:09
【问题描述】:

我正在尝试创建一个 C# 应用程序,该应用程序使用 bruteforce 恢复 MD5 哈希密码(仅用于测试,仅限于小写 a-z)

我遇到了循环问题。它需要在尝试 a-z 后添加一个新字符,并开始一个新的循环来尝试所有可能的组合。

下面的代码有效,但远非最佳。关于如何制作“智能”循环的任何提示?

public void CompareMD5()
{
    string outputMD5 = "";
    int chars = 1;
    int loop = 0;
    int i = 0;
    int ii = 0;
    while (!outputMD5.Equals(targetMD5))
    {
        if (chars == 1)
        {
            Console.WriteLine("trying " + charSet[i]);
            outputMD5 = GenerateMD5(charSet[i]);
            i++;
            if (i >= charSet.Length)
            {
                Console.WriteLine("\n" + "*** ADDING CHAR ***" + "\n");
                i = 0;
                chars++;
            }
        }

        if (chars == 2)
        {
            Console.WriteLine("trying " + charSet[i] + charSet[ii]);
            outputMD5 = GenerateMD5(charSet[i] + charSet[ii]);
            i++;
            if (i >= charSet.Length)
            {
                i = 0;
                ii++;
            }
            if (ii >= charSet.Length)
            {
                ii = 0;
                i++;
                loop++;
            }
            if (loop == 1)
            {
                Console.WriteLine("\n" + "*** ADDING CHAR ***" + "\n");
                i = 0;
                ii = 0;
                chars++;
            }
        }
    }
}

【问题讨论】:

  • 如果你真的想暴力破解哈希密码,这是最糟糕的方法,请查看“彩虹表”:project-rainbowcrack.com/table.htm
  • 我写这篇文章是为了了解 md5、散列和简单的暴力破解。但感谢您的评论。彩虹桌看起来很有趣。

标签: c# loops hash cryptography md5


【解决方案1】:

试试这个:

  // 'a', ..., 'z', 'aa', ..., 'zz', 'aaa', ..., 'zzz'
  int maxLength = 3;

  for (int length = 1; length <= maxLength; ++length) {
    // initial combination "a...a" ('a' length times)
    StringBuilder Sb = new StringBuilder(new String('a', length));

    while (true) {
      String value = Sb.ToString();
      //TODO: Test MD5 here
      // if (value.Equals(targetMD5)) {...}

      // Is this the last combination? (all 'z' string)
      if (value.All(item => item == 'z'))
        break;

      // Add one: aaa -> aab -> ... aaz -> aba -> ... -> zzz
      for (int i = length - 1; i >= 0; --i)
        if (Sb[i] != 'z') {
          Sb[i] = (Char) (Sb[i] + 1);

          break;
        }
        else
          Sb[i] = 'a';
    }
  }

【讨论】:

    猜你喜欢
    • 2017-01-04
    • 1970-01-01
    • 2012-06-17
    • 2013-08-29
    • 2021-12-21
    • 2018-09-27
    • 1970-01-01
    • 2017-05-03
    • 2017-10-13
    相关资源
    最近更新 更多