多线程强力算法

时间:2014-10-14 14:37:08

标签: c multithreading algorithm brute-force

我有一个多线程程序,它通过递增一个字符串来强制输入密码,并使用字符串分隔字符。

我以为我可以在线程之间切换" dictionnary" (字符集),但我显然是错的。

我正在做的是将 dictionnary 分成与线程一样多的部分,然后让它们处理它们的字符子集。

这是我的 dictionnary

static const char tab[] =
"abcdefghijklmnopqrstuvwxyz"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"0123456789"
"!*~";

所以基本上我做了一些愚蠢的事情,因为如果我把它分成4个线程,一个人就可以测试,即" adef"但从来没有" a * 1b"。

所以我认为这是一个更好的解决方案,但是我无法真正解决它。

这是我的递增算法(还有更多的算法,但我只重视那些重要的算法):

void *func(void * bound){

 char Test[5]="0000";

 int u = bound + nb_pas;
 for (int h = bound; h <= u; ++h){
    Test[3] = tab[h];
    for (int k = bound; k <= u; ++k){
        Test[2] = tab[k];
        for (int j = bound; j <= u; ++j){
            Test[1] = tab[j];
            for (int i = bound; i <= u; ++i){
                Test[0] = tab[i];
                if(finished == 1){
                    for(int r = 1 ; r < nb_thread; r++ ){                            
                        pthread_cancel(tid[r]);                            
                    }
                    return EXIT_SUCCESS;
                }

                char *hash = crypt_r(Test,salt,cdata);

                if(strcmp(hash,ciphertext) == 0 ){


                    // Impression du résultat
                    printf("Password found: %s\n", Test);
                    printf("Hashed version of password is %s\n", hash);
                    printf("It took %f seconds to complete in %i steps \n", elapsed, compteur);
                    finished = 1;
                    return EXIT_SUCCESS;
                }

            }
        }
    }
}

if (finished == 0){
    printf(" NO MATCH\n");
}
 return 0;
}

bound传递给与int(# of chars / # of threads) * thread index对应的主题的nb_pas (# of chars / # of threads)

我该如何处理?我想在将函数分配给线程之前模拟循环的递增,但我不知道该怎么做...

感谢您的帮助

修改

以下是我如何产生线程

for(int i = 0; i < nb_thread; i++){
        int b = nb_pas*i;
        if (pthread_create(&tid[i],NULL,func, b)!=0){ 
            printf("Une erreur s'est produite");
            return EXIT_FAILURE;
        }

    }

1 个答案:

答案 0 :(得分:0)

您可以尝试类似

的内容
for (i=0; i<nbthread; i++) {
    pthread_create(......,func,i*strlen(tab)/nbthread);
}

然后:

func(void *bound) {
    int start = (int)bound;
    int end = start+strlen(tab)/nbthread;
    for (i=start; i<end];i++) { // just one slice of the alphabet
       Test[0] = tab[i];
       for(j=0; j<strlen(tab); j++) { // every letter
           Test[1] = tab[j];
              ....

}