Javaって(サードパーティー製まで含めれば)何でもユーティリティーが揃ってそうな気がしてたけど、zipファイルの読み込みも作成も出来るくせに、なんでパスワードに対応してないんだろうな?
需要があんまり無いのかな?
でもちょっと要望があったので(Solarisのzipコマンドでは暗号化に対応してないしJavaも無理だったのでその時は諦めたけど)、Info-ZIPのソースを元に暗号化・復号化するクラスを作ってみた。
Info-ZIPがソースを公開しているのは有り難い。ライセンスから言って、移植していいのかどうかは不明だけど(汗)
ライセンスに詳しい人がいたら、教えてもらえるととっても嬉しいなぁ
暗号化したzipファイルが2通りのパスワードで復号できてしまうのですが、なぜでしょうか。
例えば別のソフトウェアを用いて qwerty というパスワードで暗号化したファイルを、
このライブラリで復号すると、qwerty の他に !8 や "L といったパスワードでも復号できてしまいます。
また、異なるファイルを qwerty というパスワードで暗号化した場合、
それぞれ正規のパスワード以外の「もう1つの」パスワードは異なります。
自分自身、ZIPの仕様そのものに詳しいわけではないのですが、その現象はある意味仕様かと思います。
パスワードのチェックはヘッダー部のCRCが一致しているかどうかなので、たまたま一致してしまうケースがあるようです。
ただ、その場合でも、実際のデータは正しく復元できていないと思います。
lhacaやlhut(unzip32)といったツールでも同じ現象が起きます。
WindowsXPのZIP復号でも、パスワードエラーとは別の動作をしますし。
データそのもののCRCまでチェックすれば正しいデータかどうかは分かりそうです。
http://www.ne.jp/asahi/hishidama/home/tech/java/zip.html#h_CRC_check
が、パスワードが間違った為なのかファイルが破損した為なのかは分からないでしょうね…。
なお、暗号化のCRCの初期値は毎回ランダムなので、同じ内容のファイルを同じパスワードで暗号化したとしても異なる内容になる為、たまたま一致するパスワードは毎回異なるものになると思われます。