【问题标题】:Algorithm for finding all possible key combinations in given range查找给定范围内所有可能的组合键的算法
【发布时间】:2013-08-04 22:00:16
【问题描述】:

上次我很好奇使用暴力破解破解我的密码需要多长时间。我想检查一下。

那么,我应该如何实现算法来查找给定范围内所有可能的组合键(例如 15 个字母)?我找到了排列算法,但它们都为给定的单词交换字母,这不是我要找的。​​p>

【问题讨论】:

    标签: brute-force


    【解决方案1】:

    假设密码可以由 89 个可能的字符(a-z、A-z、0-9、空格和 Windows 键盘上的所有不同符号键)的组合组成,则有 82 个 15 的 15 次方不同组合字符(82 * 82 * 82 ...)。换句话说,很多。

    如果您只想使用字母,并且区分大小写,则可能有 52 ** 15 种可能的 15 个字母组合。如果您还想考虑使用较短字符串的可能性,您可以编写类似(伪代码):

      long combos = 0
    
      for i = 6 TO 20           -- legal password lengths
         combos = combos + POW(52, i)
    
      print "there are " + combos.ToString() 
            + " possible passwords between 6 and 20 characters"
    

    要在 C# 中实际枚举和打印排列,您可以这样做:

      void AddNextCharAndPrintIfDone(string pwd, int maxLen)
      {
         for (char c = 'a';  c < 'Z';  c++)
         {
            pwd = pwd + c;
            if (pwd.Length >= maxLen)
                System.Console.WriteLine(pwd);
            else AddNextCharAndPrintIfDone(pwd, maxLen)
         }
      }
    
      Main()
      {
         for (int i=6;  i < 20;  i++)
               AddNextCharAndPrintIfDone("", i);
      }
    

    并不是为了效率而写的,但如果你有足够的内存和时间,你会得到所有可能的排列。

    【讨论】:

    • 我希望算法返回这些组合,而不是计算它们;)
    • @MichałTabor 您没有时间或计算机内存来进行计算。我做了一个快速的项目来计算排列,并得出:7,664,255,028,754,501,632。如果您计算每秒一百万个密码,这将需要 243,032 来运行所有可能性。只是为了练习,我会将算法添加到我的答案中。
    【解决方案2】:

    您可以下载 php pear 项目数学组合来生成这些密码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多