我正在尝试多线程,密码破解器似乎是最简单(比 opengl 更容易)的密集型任务。
是否值得花时间编写多线程密码破解程序?它会提高超线程决斗核心(4 核)的效率吗?
让 1 个线程生成哈希,而另一个线程比较它或在多个线程之间划分生成会更快吗?
我知道很多问题,回答其中任何一个都会很棒,谢谢。
我正在尝试多线程,密码破解器似乎是最简单(比 opengl 更容易)的密集型任务。
是否值得花时间编写多线程密码破解程序?它会提高超线程决斗核心(4 核)的效率吗?
让 1 个线程生成哈希,而另一个线程比较它或在多个线程之间划分生成会更快吗?
我知道很多问题,回答其中任何一个都会很棒,谢谢。
实际上有很多方法可以做到这一点。为简单起见,您应该划分大部分工作。在这种情况下,很明显大部分工作都是在计算散列时完成的。在不明显的情况下,您将需要分析您的应用程序并找出大部分时间都花在了哪里。但也要记住,许多线程创建/加入都会产生开销,因此最好在开始工作之前为每个线程分配一个工作子集(如果有人找到解决方案,也许检查一些受保护的共享变量)。
但是请注意,根据您将尝试破解的哈希类型(我假设您将是暴力破解),不能保证您的程序会完成。大多数(我指的是任何实用/有效的)散列算法都是在计算不可行的概念下运行的。如果您要生成随机字符串来破解,请注意破解者需要做的就是找到一个碰撞。例如,考虑“cat”和“dog”映射到相同的哈希值并且真正的密码是“dog”的情况。如果您的破解者发现“猫”作为解决方案,那么该解决方案同样可行。然而,这仍然是一个非常困难的问题,也不能保证完成。
另一种选择是字典攻击(因为这是教育性的——这应该是可行的)。如果你正在做一个简单的字典攻击并且这个词不在字典中,你将完全不走运。但是,这保证在您的字典末尾完成。要实现这一点,最好拆分您的字典。如果你有 4 个线程和 1000 个单词的字典,那么每个线程应该得到字典的不同子集(每个都有 250 个条目要处理)。然而,在实践中,大多数受保护的密码可能也有某种形式的盐(只是需要考虑的事情)。
最快的多线程设计通常是每个内核一个线程。为什么要线程交换?要做的工作量保持不变。在某些情况下,许多线程可能有助于缓解设计问题,但如果您想要完整的性能,则必须满足设计问题,以便每个内核可以使用一个线程。
我通常所说的核心是指单个非超线程逻辑核心。当然,存在设计技巧,问题可能在于超线程工作正常或可取。
经过广泛的研究,我可以说多线程密码破解器并不是最好的时间利用方式。
多线程虽然能够提高资源效率,但在服务器/客户端交互中也很有用。
在下面的示例中,多线程用于允许服务器同时接受多个客户端并与之交互。
while (1) {
listen(sd,10);
cliLen=sizeof(cliAddr);
printf("[LISTINING %u][%u]\n",SERVER_PORT,i);
//Accept Connection
newSd = accept(sd, (struct sockaddr *) &cliAddr, &cliLen);
if(newSd < 0)
{
perror("cannot accept connection");
exit(3);
}
pthread_create(&pth, NULL, &connectionManager, (void*)newSd);
i++;
}
…………
int connectionManager(newSd,data){
send(newSd,"[Connection Created on New Thread]\n\r",strlen("[Connection Created on New Thread]\n\r"), 0);
//pthread_create(&pthsend,NULL, &dataSender, (void*)newSd);
pthread_create(&pthget, NULL, &dataGetter, (void*)newSd);
pthread_join(pthsend, NULL);
pthread_join(pthget, NULL);
close(newSd);
pthread_exit;
}
可以进行进一步的研究以确定效率“最佳点”。对于所有 Box,这可能会有所不同。