【问题标题】:Multi-thread brute-force password breaking algorithm多线程暴力破解密码算法
【发布时间】:2012-03-19 03:42:05
【问题描述】:

我用 C++ 编写了一个多线程程序,使用蛮力算法破解 7 个字符长(仅限小写字符)的密码。

我的算法主要是 7 个嵌套的 for 循环,从 a 到 z 并测试所有可能的组合。

现在,我是这样分配工作的:
如果我有 3 个工作线程,
话题 1:axxxxxx 到 ixxxxxx
线程 2:jxxxxxx 到 rxxxxxx
线程 3:sxxxxxx 到 zxxxxxx

因此 3 个线程将继续循环,直到找到匹配项。

主线程将等待第一个线程返回。

我的问题是:这是在我的线程之间划分工作的最佳方式吗?你知道如何提高效率吗?

另外,即使这不是我审问的主要部分,你能想出比 7 for-loop 迭代更好的方法吗?

(请注意,此程序是针对学校项目,并非真正破解密码)

【问题讨论】:

  • 你能想出比7 for-loop迭代更好的方法吗?递归。
  • 提高效率的一个可靠方法是在 GPU 中进行。看oclHashcat-plus
  • @jweyrich:如果您尝试破解哈希,这是一个很好的解决方案,但如果您必须实际尝试登录,则不是很有用。

标签: c++ multithreading algorithm brute-force


【解决方案1】:

如果所有键的可能性相同,并且每个键评估键的成本相同,并且每个线程都可以预期分配给一个 CPU 而不会出现很多中断(例如,您的进程是唯一的 CPU 密集型进程一次运行),像您所做的那样均匀地划分键空间将非常有效。

如果其中一些假设无效,构建程序的一种更灵活的方法是让一个线程(生产者线程)将密钥范围分发给 1 个或多个消费者线程进行处理。一旦给定线程完成了它的工作块,它就会返回到生产者并请求一个新的键范围进行分析。

生产者/消费者模式有一些开销,但更灵活。

【讨论】:

  • 谢谢,虽然假设是有效的,但我会继续使用生产者线程。您让我意识到,这样做的目的并不是真正减少完成的测试数量(我最初的目标是),而是让它们尽可能快地完成(如果一个线程的中断更少,它就会去继续进行更多测试)。
【解决方案2】:

我会看看英特尔 TBB

我会在外循环上使用parallel_for 构造,并有一个原子变量来表示它被发现。

使用 lambdas 非常简单。

tbb::blocked_range<char> rng('a', 'z');
tbb::parallel_for(rng, [&](tbb::blocked_range<char> rng){ 
     for(char a=rng.begin(); a!=rng.end(); ++a)
     {
         //a is your top level character
     }
}); 

使用 TBB 的优势在于,正如另一个答案中提到的那样,如果一个线程在另一个 TBB 之前完成了工作窃取机制,则会构建它以允许快速线程从较慢的线程中取出工作。

【讨论】:

    【解决方案3】:

    您应该使用生产者消费者模式。 有一个(线程安全的)队列来产生候选密码和消费者线程 那应该更灵活。

    对于生成密码,您的方法没有任何问题,但是使用更长的密码可能会很乏味。

    您可以使用递归方案来生成它。 或带有一个循环的迭代方案,ascii 表上的 a-z 字符是连续的,因此您可以使用 base 26 转换来生成您的候选。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-04
      • 2011-09-14
      • 2020-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多