MultiThreaded密码破解程序

时间:2012-08-04 16:15:14

标签: c multithreading passwords cracking

我正在尝试使用多线程和密码破解程序,这似乎是最简单的(更简单的操作)密集型任务。

是否值得花时间编写多线程密码破解程序?它会提高超线程双核(4核)的效率吗?

让1个线程生成散列,而另一个线程比较它或将生成分成多个线程,会更快吗。

我知道很多问题,对任何一个问题的回答都会很棒,谢谢。

3 个答案:

答案 0 :(得分:1)

实际上有很多方法可以做到这一点。为简单起见,您应该将大部分工作分开。在这种情况下,很明显大部分工作都是在计算哈希值时完成的。如果不明显,您将需要分析您的应用程序并找出大部分时间花在哪里。但是还记得很多线程创建/连接都会产生开销,所以最好在开始工作之前为每个线程分配一部分工作(如果有人找到解决方案,可能会检查一些受保护的共享变量)。

但是,请注意,根据您将尝试破解的哈希类型(我假设您将是强制执行),无法保证您的程序将完成。大多数(据此,我指的是任何实际/有效的)散列算法在计算不可行性的概念下运行。如果你要生成随机字符串来破解,请注意所有破解者需要做的就是找到碰撞。例如,考虑“cat”和“dog”映射到相同哈希值并且真实密码为“dog”的情况。如果你的饼干发现'猫'作为解决方案,这个解决方案同样可行。然而,这仍然是一个非常棘手的问题,也无法保证完成。

另一种选择是字典攻击(因为这是教育 - 这应该是可行的)。如果你正在做一个简单的字典攻击而且这个词不在字典中,你就会失败。但是,保证在字典的末尾完成。要实现这一点,最好拆分字典。如果你有4个线程和1000个单词的字典,那么每个线程应该得到一个不同的字典子集(每个都有250个条目可以处理)。然而,在实践中,大多数受保护的密码也可能具有某种形式的盐(只需考虑一下)。

答案 1 :(得分:1)

最快的多线程设计通常是每个核心一个线程。为什么线程交换?要完成的工作量保持不变。在某些情况下,许多线程可用于简化设计问题,但如果您想要完全性能,则必须满足设计问题,以便可以使用每个核心一个线程。

核心我通常指的是一个非超线程逻辑核心。当然,存在设计技巧,问题可能是超线程工作正常或可取。

答案 2 :(得分:0)

经过广泛的研究,我可以说多线程密码破解程序不是时间的最佳用途。

多线程虽然能够提高资源效率,但在服务器\客户端交互中也很有用。

在下面的示例中,多线程用于允许服务器同时接受多个客户端并与之交互。

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,这可能会有所不同。

相关问题