pkcrack入門:既知平文攻撃でZIPパスワードを解析する

セキュリティ

パスワードで保護されたZIPファイルを開こうとしたら、パスワードを忘れてしまった…なんて経験はありませんか?🤔 そんな時に役立つかもしれないツールの一つが「pkcrack」です。このツールは、特定の条件下でZIPファイルのパスワードを解析することができます。

この記事では、pkcrackの仕組みとその使い方、そして注意点について詳しく解説していきます。ただし、この技術は強力であるため、許可なく他人のファイルを解析することは絶対にやめてください。倫理的な利用を心がけましょう。

⚠️ 注意事項

  • 本記事で紹介する内容は、学術的な目的や、自身が所有するファイル、または解析する正当な権利を持つファイルに対してのみ使用してください。
  • 許可なく第三者のファイルを解析する行為は、不正アクセス禁止法などの法律に抵触する可能性があり、重大な法的責任を問われることがあります。
  • ツールの使用は自己責任で行ってください。

pkcrackとは?

pkcrackは、Peter Conrad氏によって開発された、パスワードで保護されたZIPファイルを復号するためのオープンソースツールです。特に「既知平文攻撃(Known-Plaintext Attack)」と呼ばれる手法を用いてパスワード解析を行います。

重要な点として、pkcrackは古いタイプのZIP暗号化方式(ZipCrypto)に対して有効なツールです。近年主流となっているAES(AES-128やAES-256)で暗号化されたZIPファイルには、このツールは基本的に使用できません。

pkcrackの公式サイトやソースコードは以下の場所などで見つけることができます。(リンク先の情報は自己責任でご確認ください)

既知平文攻撃(Known-Plaintext Attack)とは?

既知平文攻撃は、暗号化されたデータ(暗号文)の一部と、それに対応する元のデータ(平文)の一部が分かっている場合に、それらの情報を手がかりにして暗号鍵やパスワードを特定しようとする攻撃手法です。

ZipCryptoアルゴリズムの仕組み上の弱点を突くことで、pkcrackはこの攻撃を可能にしています。ZipCryptoは、パスワードから生成される内部キーを使ってデータをストリーム暗号化しますが、この内部キーと平文・暗号文の関係性から、元の内部キーを推測することができるのです。

この攻撃が成功するためには、以下の条件を満たす必要があります。

既知平文攻撃の条件

  1. 暗号化されたZIPファイル (Ciphertext ZIP): 解析対象のパスワード付きZIPファイル。
  2. 既知の平文ファイル (Known Plaintext): 上記の暗号化ZIPファイルに含まれているファイルのうち、少なくとも1つの、暗号化される前の元ファイル。
  3. 平文ファイルの条件:
    • 暗号化ZIPファイル内のファイルと完全に同一である必要があります(1バイトの違いも許されません)。
    • ZIPファイルに格納される際に使用された圧縮方式が同じである必要があります(多くの場合、Deflate方式が使われます)。
    • 攻撃を成功させるには、最低でも12バイトの連続した平文データが必要とされます。平文データが多いほど、解析は高速かつ成功しやすくなります。
  4. 暗号化方式: ZIPファイルの暗号化方式がZipCryptoであること。AES暗号化には適用できません。

最も困難なのは、多くの場合「既知の平文ファイル」を正確に入手することです。例えば、以下のようなケースが考えられます。

  • ZIPファイルを作成する前に持っていたオリジナルのファイル。
  • ソフトウェアの配布物に含まれる定型的なファイル(README.txt、LICENSEなど)がZIP内に含まれている場合、同じバージョンのソフトウェアからそのファイルを入手する。
  • WebサイトからダウンロードしたファイルがZIPに含まれており、その元ファイルがまだWebサイトで公開されている。

CRCチェックサムなどの情報を使って、ZIPファイル内のファイルと手元にあるファイルが同一であるかを確認することも有効な手段です。

pkcrackの入手と準備

pkcrackは通常、ソースコードからコンパイルして使用します。Linux環境であれば、リポジトリからインストールできる場合もあります(例:FreeBSDではportsに存在)。WindowsやmacOSで使用する場合は、多くの場合、自分でビルドする必要があります。

ビルドにはC++コンパイラ(gccやclangなど)やmakeユーティリティが必要です。CMakeを使用するバージョンも存在します。具体的なビルド方法は環境によって異なるため、ダウンロードしたパッケージに含まれるREADMEファイルなどを参照してください。

例えば、CMakeを使った一般的なビルド手順は以下のようになります(Linux/macOSの場合)。


# ソースコードをダウンロード (例: git clone)
git clone https://github.com/keyunluo/pkcrack.git
cd pkcrack

# ビルド用ディレクトリを作成
mkdir build
cd build

# CMakeでビルド設定
cmake ..

# コンパイル実行
make
      

ビルドが成功すると、実行ファイル(`pkcrack`, `zipdecrypt`, `findkey`など)が生成されます。

pkcrackの使い方ステップ・バイ・ステップ

pkcrackを用いた解析の基本的な流れを説明します。

ステップ1: 必要なファイルの準備

以下のファイルを用意します。

  • 暗号化されたZIPファイル (例: `encrypted.zip`): パスワードを解析したいZIPファイル。
  • 既知の平文ファイル (例: `plaintext_file.txt`): `encrypted.zip`の中に含まれているファイルの、暗号化される前のオリジナルファイル。
  • 平文ファイルを含む(暗号化されていない)ZIPファイル (例: `plain.zip`): `plaintext_file.txt`を、`encrypted.zip`と同じ圧縮方法(例: Deflate)で圧縮して格納した、パスワードのかかっていないZIPファイル。これはpkcrackの主要な使い方で要求されることが多いです。

重要: `plain.zip`を作成する際、`encrypted.zip`内部の該当ファイルと同じ圧縮方法・圧縮レベルを使用する必要があります。多くの場合、標準的なDeflate圧縮で問題ありませんが、異なる場合は解析に失敗します。ツールによっては圧縮方式を確認できる場合があります(例: `unzip -v encrypted.zip`)。

ステップ2: pkcrackコマンドの実行

準備ができたら、pkcrackコマンドを実行して内部キーの探索を開始します。基本的なコマンド形式は以下の通りです。


pkcrack -C encrypted.zip -c path/to/encrypted_member.ext -P plain.zip -p path/to/plaintext_member.ext -d decrypted.zip -a
      

各オプションの意味は以下の通りです。

オプション説明
-C encrypted.zip暗号化されたZIPファイル(Ciphertext archive)を指定します。
-c path/to/encrypted_member.ext暗号化ZIPファイル内で、平文がわかっているファイルの名前(Ciphertext name)を指定します。パスを含む場合もあります。
-P plain.zip平文ファイルを含む、暗号化されていないZIPファイル(Plaintext archive)を指定します。
-p path/to/plaintext_member.ext平文ZIPファイル内の、既知の平文ファイルの名前(Plaintext name)を指定します。-cで指定したファイルに対応するものです。
-d decrypted.zip復号されたZIPファイルの出力先ファイル名を指定します。このオプションは省略すると処理が正常に完了しないことがあるため、必ず指定することを推奨します。
-aキーが見つかった後、自動的に復号処理(zipdecryptの実行)を行います。

もし、平文ファイルそのもの(ZIP圧縮されていない状態)しか持っていない場合は、-P-pの代わりに直接平文ファイルを指定するオプションもありますが、圧縮状態の不一致などで失敗しやすいため、通常は平文を一度ZIP圧縮したplain.zipを用意する方が確実です。


# 平文ファイルを直接指定する (成功率は下がる可能性あり)
pkcrack -C encrypted.zip -c path/to/encrypted_member.ext -p plaintext_file.txt -d decrypted.zip -a
      

コマンドを実行すると、キーの探索が始まります。平文データの量やマシンのスペックによりますが、数分から数時間、あるいはそれ以上かかることもあります。


Files read. Starting stage 1 on Mon Mar 31 09:18:00 2025
Generating 1st generation of possible key2 values... done.
Found 4194304 possible key2 values.
Reducing 1st generation of possible key2 values... done.
Found 11116 possible key2 values.
... (しばらく処理が続く) ...
Reducing 2nd generation of possible key2 values... done.
Found 1 possible key2 values.
Stage 1 completed. Starting stage 2 on Mon Mar 31 09:20:00 2025
Searching... 100.0%
Ta-daaaaa! key0=xxxxxxxx, key1=yyyyyyyy, key2=zzzzzzzz
Probabilistic test succeeded for xxxx bytes.
Found password: '(パスワードが見つかれば表示される)'
Finished automagic decryption.
      

上記のように “Ta-daaaaa!” と表示されれば、キーの特定に成功しています。-aオプションを付けていれば、指定したdecrypted.zipに復号されたZIPファイルが出力されます。

ステップ3: 復号されたファイルの確認

出力されたdecrypted.zipを通常のZIP解凍ツール(unzipコマンドやWindowsのエクスプローラーなど)で開けるか確認します。CRCエラーなどが出ずに正常に解凍できれば成功です🎉。

もし-aオプションを付けずに実行した場合や、自動復号に失敗した場合は、pkcrackが出力したキー(key0, key1, key2)を使って、手動でzipdecryptコマンドを実行して復号を試みます。


zipdecrypt <key0> <key1> <key2> encrypted.zip decrypted.zip
      

<key0>, <key1>, <key2> には、pkcrackが出力した16進数の値を指定します。

重要な考慮事項とトラブルシューティング

pkcrackを使う上で注意すべき点や、うまくいかない場合の対処法について説明します。

よくある失敗原因

  • 平文ファイルが違う: 用意した平文ファイルが、ZIP内のファイルと完全に一致していない。ファイル名だけでなく、内容が1バイトでも異なると失敗します。更新日時やファイルサイズだけでなく、ハッシュ値(MD5, SHA1など)を比較して同一性を確認しましょう。
  • 圧縮方法が違う: 平文ZIP(`plain.zip`)を作成する際の圧縮方法が、暗号化ZIP(`encrypted.zip`)内のファイルの圧縮方法と異なっている。特に、圧縮レベル(無圧縮、通常、最高など)が違うと失敗することがあります。
  • 暗号化方式が違う: 解析対象のZIPファイルがZipCryptoではなく、AESなどのより強力な方式で暗号化されている。7-Zipなどのツールで暗号化方式を確認できます。
  • 平文データが不足している: 既知の平文データが12バイト未満である。
  • pkcrackのオプション指定ミス: 特に-dオプションを付け忘れて処理が終わらないケースがあります。
  • OSによる微妙な差異: Windowsで作成したZIPとLinux/macOSで作成したZIPでは、同じ圧縮設定でも内部データが微妙に異なる場合があり、それが原因で失敗することもあります。可能であれば、暗号化ZIPが作成されたのと同じOS環境で平文ZIPを作成すると成功率が上がります。

もし解析に失敗した場合、pkcrackが出力するログメッセージを確認し、どの段階で問題が発生しているかを確認することが重要です。

pkcrack以外のパスワード解析方法

ZIPファイルのパスワード解析には、pkcrackの既知平文攻撃以外にもいくつか方法があります。

攻撃手法概要必要なもの主なツール例特徴
既知平文攻撃暗号文と対応する平文の一部を使ってキーを解析する(pkcrackの手法)。暗号化ZIP、平文ファイルの一部(12バイト以上)、ZipCrypto暗号pkcrack, bkcrackZipCryptoに対して非常に有効。平文が入手できれば、パスワードの複雑さに関係なく解析できる可能性がある。AESには無効。
辞書攻撃パスワードに使われそうな単語リスト(辞書)を使って総当たり的に試す。暗号化ZIP、パスワード辞書ファイルJohn the Ripper, Hashcat, fcrackzipよく使われる単語や簡単なパスワードなら高速に見つかる可能性がある。辞書にない複雑なパスワードには無力。
ブルートフォース攻撃(総当たり攻撃)可能な文字の組み合わせを全て試す。暗号化ZIPJohn the Ripper, Hashcat, fcrackzip理論上はいつか必ず見つかるが、パスワードが長くて複雑だと天文学的な時間がかかる。短い単純なパスワードには有効。GPUを使うと高速化できる場合がある。
マスク攻撃ブルートフォース攻撃の一種。パスワードのパターン(例:「大文字+小文字8文字+数字2文字」)が分かっている場合に、そのパターンに沿って総当たりする。暗号化ZIP、パスワードのパターン情報Hashcat完全なブルートフォースより効率が良いが、パターンが不明な場合は使えない。

John the RipperやHashcatは、ZIPファイルからパスワードハッシュを抽出し(`zip2john`を使用)、それに対して辞書攻撃やブルートフォース攻撃を行うことができます。これらはAES暗号化されたZIPファイルにも(原理的には)適用できますが、AESの強度が高いため、現実的な時間で解析できるのは非常に弱いパスワードの場合に限られます。

まとめ

pkcrackは、古いZipCrypto方式で暗号化されたZIPファイルに対して、既知平文攻撃という強力な手法でパスワード解析を行うツールです。成功させるには、暗号化ZIPファイルと、その中に含まれるファイルの一つの平文(完全に同一で、同じ圧縮方式のもの)が必要です。

このツールは特定の条件下では非常に有効ですが、AESなどの新しい暗号化方式には対応していません。また、既知平文を入手することが現実的に難しい場合も多いです。

繰り返しになりますが、この技術を悪用することは絶対に許されません。パスワードを忘れてしまった自分のファイルや、正当な権限を持つファイルに対してのみ、倫理的に利用するようにしてください。🔒

ZIPファイルのパスワード忘れは誰にでも起こりうることですが、安易なパスワードを設定しない、重要なファイルはより安全な方法で管理するなど、日頃からの対策も重要です。👍

参考情報

この記事を作成するにあたり、以下の情報を参考にしました。

コメント

タイトルとURLをコピーしました