1

私のプログラムはブルート フォース パスワード クラッカー (学校の課題) であるはずです。入力引数は次のとおりです。

./crack threads keysize target

プログラムは、キーサイズの長さのパスワードをチェックする必要がありますが、短いパスワードもチェックする必要があります。一度に1文字ずつ変更するだけで、これを続ける方法を書く方法がわかりません..(キーサイズの最大値は8になります)

例..

keysize = 5 なので、ループ (私が思うに) は、"aaaaa" から "aaaab" から "aaaac" に等しい何かを変更し、各結果を crypt_r() にソルト (ターゲットの最初の 2 文字) と共に変更する必要があります。 ) 一致が見つかるまで。

次のステップはマルチスレッドを追加することなので、crypt_r を使用しています。

この質問を説明するために他に何かが本当に必要かどうかはわかりません。明確にしていただければ幸いです。

4

2 に答える 2

2

どれどれ。10^n 個の n 桁の 10 進数が考えられます。したがって、a ~ z のみを使用する 8 文字のパスワードは 26^8 通りあります。これは 208,827,064,576 になります。

単純な 64 ビット カウンターを使用して数値を追跡し、その数値を base-26 表現に変換できます。何かのようなもの:

long max = 208827064576;
longlong counter = 0;

while (counter < max)
{
    char password[9];
    GetPassword(counter, password);
    // do whatever you want with the password
    ++counter;
}

void GetPassword(longlong count, char* pass)
{
    int i;
    int rem;
    if (count == 0)
    {
        pass[0] = 'a';
        pass[1] = '\0';
        return;
    }
    i = 0;
    do
    {
        int rem = count % 26;
        pass[i] = 'a' + rem;
        ++i;
        count /= 26;
    } while (count > 0)
}

counterインターロックされた変数のインクリメントを使用して、これを複数のスレッドで簡単に使用できるようにすることができます。または、検索スペースを分割して、1 つのスレッドが 0 から始まり、1 つのスレッドが 26^7 (baaaaaaa になります) から始まるようにすることもできます。

2000 億はかなり大きな数字です。10 億秒は 32 年近くになります。1 秒間に数千件をチェックできたとしても (可能性は低いですが)、徹底的な検索を行うにはかなりの時間がかかります。

于 2013-09-26T18:46:45.443 に答える