私はマルチスレッドを試していますが、パスワード クラッカーは最も単純な (opengl よりも簡単な) 集約的なタスクのようです。
マルチスレッドのパスワード クラッカーを作成する価値はありますか? ハイパー スレッド デュエル コア (4 コア) で効率が向上しますか?
1 つのスレッドでハッシュを生成し、別のスレッドで比較するか、生成を複数のスレッドに分割する方が高速でしょうか。
私が知っている多くの質問、それらのいずれかへの回答は素晴らしいでしょう、ありがとう.
私はマルチスレッドを試していますが、パスワード クラッカーは最も単純な (opengl よりも簡単な) 集約的なタスクのようです。
マルチスレッドのパスワード クラッカーを作成する価値はありますか? ハイパー スレッド デュエル コア (4 コア) で効率が向上しますか?
1 つのスレッドでハッシュを生成し、別のスレッドで比較するか、生成を複数のスレッドに分割する方が高速でしょうか。
私が知っている多くの質問、それらのいずれかへの回答は素晴らしいでしょう、ありがとう.
最速のマルチスレッド設計は、通常、コアごとに1つのスレッドです。なぜスレッドスワップなのか?実行する作業の量は同じままです。多くのスレッドは、設計の問題を緩和するために状況によっては役立つ場合がありますが、完全なパフォーマンスが必要な場合は、コアごとに1つのスレッドを使用できるように設計の問題を満たす必要があります。
コアとは、通常、単一の非ハイパースレッド論理コアを意味します。もちろん、設計上のトリックが存在し、問題はハイパースレッディングが正常に機能するか、望ましいものである可能性があります。
これには実に多くの方法があります。簡単にするために、作業の大部分を分割する必要があります。この場合、ほとんどの作業がハッシュの計算で行われることは明らかです。明らかでない場合は、アプリケーションのプロファイルを作成し、どこで多くの時間が費やされているかを調べます。ただし、多くのスレッドの作成/結合でオーバーヘッドが発生することも忘れないでください。そのため、作業を開始する前に各スレッドに作業のサブセットを割り当てることをお勧めします (誰かが解決策を見つけた場合は、保護された共有変数を確認してください)。
ただし、クラックしようとしているハッシュの種類によっては (総当たり攻撃を行うと想定しています)、プログラムが終了する保証はないことに注意してください。ほとんどの(つまり、実用的/効果的なものを意味します)ハッシュアルゴリズムは、計算不可能性の概念の下で動作します。クラックするランダムな文字列を生成する場合、クラッカーが行う必要があるのは衝突を見つけることだけであることに注意してください。たとえば、'cat' と 'dog' が同じハッシュ値にマップされ、実際のパスワードが 'dog' である状況を考えてみましょう。あなたのクラッカーが解決策として 'cat' を見つけた場合、この解決策は実行可能です。ただし、これは依然として非常に難しい問題であり、終了する保証もありません。
もう 1 つの代替手段は、辞書攻撃です (これは教育的なものであるため、実行可能であるはずです)。単純な辞書攻撃を行っていて、単語が辞書にない場合は、単に運が悪いだけです。ただし、これは辞書の最後で終了することが保証されています。これを実装するには、辞書を分割するのが最善です。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;
}
効率の「スイート スポット」を決定するために、さらに調査を行うことができます。これは、すべてのボックスで異なる可能性があります。