多线程强力密码破解算法

时间:2012-03-19 03:42:06

标签: c++ multithreading algorithm brute-force

我在C ++中创建了一个多线程程序,使用强力算法来破解长度为7个字符的密码(仅限小写字符)。

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

现在,我正在以这种方式分工:
如果我有3个工作线程,
线程1:axxxxxx到ixxxxxx
线程2:jxxxxxx到rxxxxxx
线程3:sxxxxxx到zxxxxxx

所以3个线程将继续循环,直到找到匹配为止。

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

我的问题是:这是在我的线程之间划分工作的最佳方法吗?您对我如何提高效率有任何想法吗?

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

(请注意,此程序适用于学校项目而非真正破解密码)

3 个答案:

答案 0 :(得分:6)

如果所有密钥都具有相同的可能性,并且评估密钥的成本对于每个密钥是相同的,并且每个线程可以期望分配给一个CPU而没有很多中断(例如,您的进程是唯一的CPU密集型一个正在运行),按照你的方式对键空间进行均匀分区将非常有效。

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

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

答案 1 :(得分:1)

我会看一下intel 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之前完成了一个工作窃取机制,它允许快速线程从较慢的线程开始工作。

答案 2 :(得分:0)

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

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

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