技術資料
Info-ZIPのソースは、Zipを理解する上で非常に役に立ちました。
Elcom Ltd.のAdvanced ZIP Password Recoveryのreadme.txtは高速化へのヒントを与えてくれました。Zipのパスワードはどうなっているか
Zipのパスワードは最長80文字。 その組み合わせは, 入力できる文字種が100としても100の80乗+100の79乗+・・・
パスワードの探しかた
途方も無い組み合わせの中から1つを見つけだすためには総当たりが確実です。Pika Zipは現在、CPUに6x86MX-PR200使用時、pikazip.zip内のtest.zipのパスワードを調べる場合、秒間280,000個のパスワードをテストします。これではあまりに時間がかかってしまいます。そこで、それ以外の方法つまりディクショナリーアタックが使われます。人がパスワードを入力するわけですから、単語(例えば、parsonal)または単語の組み合わせ(例えば、parsonalcomputer)を入力するでしょう。それらの一覧(辞書)をあらかじめ用意しておくわけです。時間は圧倒的に短くなります。しかし総当たりではないのですから、必ず見つかるというわけではありません。辞書は語数の多いものが良いでしょう。また辞書生成エンジンも重要でしょう。辞書生成エンジンは単語から単語の組み合わせを生成したり、単語をモディファイします(例えば、parsonal→Parsonal、power→p0wer)。これは辞書のサイズを押さえてつつ語数を増やすことに貢献します。
パスワードは入力されるとまずファイルが圧縮されたときにつけられたランダムな12Byteのデータと計算され1Byteのデータとなり、CRCの24-32bitと比較されます。このとき2つのデータが同一ならそのパスワードは正解かもしれませんが実際にそのパスワードで解凍してみないと正解かどうかは分かりません。なぜならこのチェックでは全パスワードの1/250は同じ値を持つからです。
これは実際にpikazip.zipに同梱されたtest.zipを解凍することで体験できます。このアーカイブを解凍するときに、適当なパスワードを入力してみてください。パスワードが違うというメッセージが表示されたでしょう(Lhasaでは再度パスワード入力になる)。では次に53と入力してみてください。実際に解凍はするがCRCエラーになってしまいます(Lhasaでは破損ファイルと表示)。1/250ではかなりの回数、アーカイブを解凍してみなければなりません。小さなアーカイブならたいしたこともありませんが、数Mとなればそれなりに時間がかかります。ですから解凍の負担を押さえる必要があるわけです。
そのために複数のファイルがアーカイブ内にある時は、それらは同じパスワードで圧縮されたと仮定します(これはオプションの同一パスワードでOn/Offできます)。これによりファイル数分、1/250されるわけです 。これで解凍回数が減ります(Elcom Ltd.参考)。またあらかじめアーカイブ内の1番ファイルサイズの小さい物を解凍するようにすれば解凍の負荷が減ります。
Lhasa: Copyright Takemura
RARはただ解凍を繰り返しているだけなので非常に遅いです。
ソースを見て気づいたこと
マルチボリュームのサイズは個々にまちまちにできるので例えばMO1枚+フロッピー2枚とかに分割できてWINRARで普通に解凍できる。