2

zip4jを使用してzipファイルのパスワードを見つけるプログラムを作成しました。ブルートフォース方式を使用したため、以下のコードを使用して各パスワードをファイルでチェックする必要があります。

while(true)
try
{
  zipFile.setPassword(passstr);
  zipFile.extractAll(deststr);
  break;
}
catch (Exception ex2)
{ 
    //passstr = next password string to be checked
}

しかし、毎回ループ内で io 関連のタスクが繰り返されるため、これは非常に遅いです。zip ファイルのパスワードを確認する他の方法はありますか? または、何らかの方法でファイルをメモリに移動して高速化する必要がありますか? またはそれを高速化する他の解決策はありますか?

ありがとう

4

3 に答える 3

1

ブルートフォースは、恥ずかしいほど並行した問題です。この問題を解決するには、コアごとに 1 つのスレッドを使用するようにしてください。

さらに、(あなたが言ったように) I/O を避けるべきです。このために、ファイルをメモリにロードし、I/O を使用せずにパスワードをテストする方法を見つけます。(また、テスト期間を最小限に抑えるようにしてください。ウィキペディアとこの仕様によると、zip ファイルには暗号化されたヘッダーが含まれている可能性があり、パスワードのテストがより高速になる可能性があります。テストが可能な場合)。

並列ソリューションとメモリ ソリューションを組み合わせると、スレッドごとにメモリ内のファイルのコピーを 1 つ使用する必要があることは明らかです。

最後に、見つけられる最速の復号化の実装を使用してみてください。(c多分でそれをしますか?)

于 2013-03-13T12:27:38.393 に答える
0

次のロジックを試してください。

  • プログラムを開始する
  • フォルダのパスは Java プログラムと共有する必要があります。
  • 最初に、必要に応じて同じフォルダーに複数の zip ファイルのコピーを作成します。
  • 次に、作成したコピーごとに個別のスレッドを開始します。
  • 異なるブルート フォース ディクショナリ セットを含む各スレッドでパスワード クラック プロセスを実行します。
  • 最初は false になるクラス内の共通フラグを保持し、各スレッドは実行のためにそのフラグに従います
  • 最後に、いずれかのスレッドがソリューションで true を返すと、フラグが設定され、他のすべてのスレッドが処理を停止します。

スレッドの数は、必要に応じて、またはパフォーマンスごとに設定できます

于 2013-03-13T11:52:33.193 に答える
0

Vineet が既に述べたように、スレッド化を適用するとパフォーマンスがいくらか向上します。ただし、より洗練されたアプローチは次のようになります。

  • ファイルで使用されている暗号化アルゴリズムを特定する
  • ファイルを一度メモリに読み込む
  • いくつかのスレッドを起動して、生成されたパスワードで生データを復号化します
  • ライブラリ/復号化メカニズムに応じて、結果として例外またはランダムなビットの寄せ集めが発生します。この場合、最初の数バイトで zip ファイルのファイル署名を確認してください。

ただし、ファイルを保護した人が安全なパスワードを生成する方法を知っている場合は、数千年待つ覚悟をしてください!

于 2013-03-13T12:08:08.727 に答える