デジタルデータのセキュリティを確保する上で、ファイルの暗号化は非常に重要な手段です。特に、GnuPG (GPG) は、オープンソースで信頼性の高い暗号化ツールとして広く利用されています。しかし、もしGPGで暗号化されたファイルのパスフレーズを忘れてしまった場合や、セキュリティ監査の一環としてパスワード強度をテストする必要がある場合、どうすればよいでしょうか? 🤔
ここで登場するのが、パスワードクラッキングツールとして有名な John the Ripper (JtR) スイートに含まれる gpg2john
というユーティリティです。gpg2john
は、GPGで暗号化されたファイル(特にパスフレーズで暗号化されたファイルや、パスフレーズで保護された秘密鍵ファイル)から、John the Ripperが解析できる形式の「ハッシュ」データを抽出する役割を担います。
このブログ記事では、gpg2john
の基本的な使い方から、John the Ripperと連携して実際にパスフレーズ解析を行う手順までを、初心者にも分かりやすく解説します。🔒➡️🔑
⚠️倫理的な注意点
パスワードクラッキングツールは、自身が所有するファイルや、明示的に許可を得たシステムに対してのみ使用してください。他人のファイルやシステムに対して無許可で使用することは、不正アクセス行為として法律で禁止されており、重大な犯罪となります。この記事は、教育目的および正当な理由(パスワードリカバリー、セキュリティ監査など)での利用を前提としています。
GnuPG (GPG) とは?
GnuPG (GNU Privacy Guard) は、OpenPGP 標準のフリーソフトウェア実装であり、データの暗号化と電子署名を提供します。主に以下の二つの暗号化方式を利用します。
- 公開鍵暗号方式: 各ユーザーが「公開鍵」と「秘密鍵」のペアを持ちます。ファイルを暗号化する際は受信者の「公開鍵」を使用し、復号する際は受信者自身の「秘密鍵」を使用します。秘密鍵は通常、パスフレーズによって保護されています。
-
共通鍵暗号方式 (対称鍵暗号方式): 暗号化と復号に同じ「パスフレーズ」を使用します。
gpg -c filename
のように-c
オプション(--symmetric
)を使ってファイルを暗号化した場合、この方式が用いられます。
gpg2john
は、主に共通鍵暗号方式で暗号化されたファイルや、パスフレーズで保護された秘密鍵ファイルからハッシュ情報を抽出するために使用されます。
John the Ripper (JtR) とは?
John the Ripper (JtR) は、非常に強力で広く使われているオープンソースのパスワードクラッキングツールです。元々はUnix系のパスワードハッシュを解析するために開発されましたが、現在では「Jumbo」バージョンを中心に、非常に多くの種類のハッシュ形式に対応しています。
JtRは、辞書攻撃、ブルートフォース攻撃(総当たり攻撃)、インクリメンタルモード(文字種と長さを指定して試行)など、様々な手法を用いてパスワードを解析します。システム管理者が弱いパスワードを検出したり、セキュリティ担当者がペネトレーションテストを行ったりする際に利用されます。gpg2john
は、JtRがGPG関連のパスフレーズを解析できるようにするための「橋渡し役」となるツールなのです。🌉
gpg2john の役割
gpg2john
の主な役割は、GPG関連のファイルから、John the Ripperが理解できる形式のハッシュ文字列を抽出することです。具体的には、以下のファイルタイプを処理できます。
- 共通鍵暗号方式 (
gpg -c
) で暗号化されたファイル (.gpg) - パスフレーズで保護された GPG 秘密鍵ファイル (.asc またはバイナリ形式)
なぜ直接GPGファイルをJtRに渡せないのでしょうか? それは、JtRがパスワードを試行するためには、元のファイル全体ではなく、パスフレーズの検証に必要な部分(暗号化パラメータや鍵導出に必要な情報など)を特定のフォーマットで抽出する必要があるからです。gpg2john
はこの「抽出とフォーマット変換」を行ってくれる重要なツールです。🛠️
gpg2john のインストール
gpg2john
は通常、John the Ripper (Jumbo バージョン) に同梱されています。したがって、John the Ripperをインストールすれば gpg2john
も利用可能になります。
インストール方法はOSによって異なります。
Linux (Debian/Ubuntu系)
sudo apt update
sudo apt install john
Linux (RHEL/CentOS/Fedora系)
EPELリポジトリなどを利用するか、ソースからコンパイルするのが一般的です。
# EPELが有効な場合
sudo yum install john
# または dnf
sudo dnf install john
macOS
Homebrew を使うのが簡単です。
brew install john
上記のコマンド名はディストリビューションやバージョンによって `john-jumbo` など異なる場合があります。
ソースからのコンパイル (より最新版を使いたい場合)
John the Ripper の公式サイトから “jumbo” バージョンのソースコード (例: `tar.xz` 形式) をダウンロードし、展開してコンパイルします。
# 例: john-1.9.0-jumbo-1.tar.xz の場合
wget https://www.openwall.com/john/k/john-1.9.0-jumbo-1.tar.xz
tar xvfJ john-1.9.0-jumbo-1.tar.xz
cd john-1.9.0-jumbo-1/src
./configure
make -s clean && make -sj4 # 4はCPUコア数に合わせて調整
# コンパイル後、../run ディレクトリに実行ファイルが生成される
cd ../run
ls gpg2john # gpg2john が存在するか確認
インストール後、which gpg2john
や gpg2john --help
(ヘルプオプションは無い場合が多いですが) を実行して、パスが通っているか、実行できるかを確認しましょう。通常、John the Ripper の実行ファイルと同じディレクトリ (例: /usr/sbin/
や /usr/bin/
、ソースからビルドした場合は run
ディレクトリ) にあります。
基本的な使い方
gpg2john
の基本的なコマンド構文は非常にシンプルです。
gpg2john [対象のGPGファイル] > [出力先のハッシュファイル]
[対象のGPGファイル]
: パスフレーズを解析したい GPG で暗号化されたファイル (.gpg
) または GPG 秘密鍵ファイル (.asc
など) のパスを指定します。>
: シェルのリダイレクト機能です。gpg2john
が標準出力に書き出すハッシュ文字列を、指定したファイルに保存します。[出力先のハッシュファイル]
: 抽出されたハッシュ文字列を保存するファイル名を指定します。慣例的に.hash
や.txt
といった拡張子が使われますが、任意です。
gpg2john
自体には複雑なオプションはあまりありません。主な役割はハッシュの抽出とフォーマット変換だからです。
実践!gpg2john を使ってみる
実際に gpg2john
を使ってハッシュを抽出してみましょう。ここでは、共通鍵暗号方式 (gpg -c
) で暗号化されたファイルを例にします。
ステップ1: サンプルのGPGファイルを作成
まず、テスト用の簡単なテキストファイルを作成し、GPGでパスフレーズを使って暗号化します。
# 1. テスト用のテキストファイルを作成
echo "これは秘密のメッセージです。" > secret.txt
# 2. GPGで共通鍵暗号化 (-c オプション)
# パスフレーズの入力を求められるので、設定する (例: 'password123')
gpg -c secret.txt
# 3. secret.txt.gpg という暗号化ファイルが生成されることを確認
ls secret.txt.gpg
この例では、`secret.txt.gpg` というファイルが作成され、’password123′ というパスフレーズで暗号化されています。
ステップ2: gpg2john でハッシュを抽出
次に、作成した secret.txt.gpg
ファイルに対して gpg2john
を実行し、ハッシュをファイルに保存します。
# gpg2john を実行し、出力を gpg_hash.txt に保存
gpg2john secret.txt.gpg > gpg_hash.txt
# 出力ファイルの中身を確認 (一部表示)
head gpg_hash.txt
gpg_hash.txt
の中身は、以下のような形式になっているはずです(具体的な内容はファイルやGPGバージョンによって異なります)。
$gpg$*0*...長い文字列...*...*...*$
この $gpg$
で始まる長い文字列が、John the Ripperが解析できる形式のハッシュデータです。ファイル名、暗号アルゴリズムの種類、ソルト、暗号化されたデータの一部などが含まれています。
ℹ️ 秘密鍵ファイルの場合:
もしパスフレーズで保護された秘密鍵ファイル (例: my_private_key.asc
) のハッシュを抽出したい場合は、同様に以下のように実行します。
gpg2john my_private_key.asc > private_key_hash.txt
この場合も $gpg$
で始まる形式のハッシュが出力されます。
🚫 エラーが出る場合:
gpg2john
実行時に “Bad parameter” や “MDC is missing” といったエラーや警告が出ることがあります。”MDC is missing” は、古いGPG形式などで改竄検出コードがない場合に表示されることがありますが、解析自体は可能な場合が多いです。しかし、エラーによってはハッシュが正しく抽出できない場合もあります。GPGファイルの破損や、gpg2john
が対応していない形式である可能性も考えられます。
2017年頃には、特定の暗号アルゴリズム (例: CAST5) を使用した場合に gpg2john
がうまく動作しないという報告もありましたが、最新のJumboバージョンでは改善されている可能性が高いです。
John the Ripper でパスフレーズを解析
gpg2john
でハッシュファイル (gpg_hash.txt
) を作成したら、いよいよ John the Ripper を使ってパスフレーズの解析を試みます。
基本的な実行
最も基本的な使い方は、John the Ripperにハッシュファイルを指定するだけです。
john gpg_hash.txt
これを実行すると、John the Ripperはデフォルトのモード(シングルクラックモード、ワードリストモード、インクリメンタルモード)を順番に試行します。
辞書攻撃 (Wordlist Mode)
特定のパスワードリスト(辞書ファイル)を使って攻撃を試みる場合は、--wordlist
オプションを使用します。これは最も一般的に使われる方法の一つです。強力な辞書ファイルを用意することが成功の鍵となります 🔑。
# /path/to/wordlist.txt は実際の辞書ファイルのパスに置き換える
john --wordlist=/path/to/wordlist.txt gpg_hash.txt
Kali Linuxなどには rockyou.txt
といった有名な辞書ファイルが含まれていることがあります (/usr/share/wordlists/rockyou.txt.gz
など)。
インクリメンタルモード (Incremental Mode)
特定の文字種(例: 小文字アルファベットのみ、数字のみなど)と長さを指定して、全ての組み合わせを試行するブルートフォース攻撃です。--incremental
オプションを使用します。
# 例: 小文字アルファベットのみ (john.conf の設定に依存)
john --incremental=Lower gpg_hash.txt
# 例: 数字のみ (john.conf の設定に依存)
john --incremental=Digits gpg_hash.txt
このモードは、パスワードが単純な場合に有効ですが、文字種や長さが増えると組み合わせが爆発的に増加し、非常に時間がかかります ⏳。設定は john.conf
(または john.ini
) ファイルでカスタマイズできます。
解析結果の表示
John the Ripperがパスフレーズを発見すると、通常は画面に表示されます。解析が完了した後や、中断した後に結果を確認するには --show
オプションを使用します。
john --show gpg_hash.txt
以下のような形式で、ファイル名と見つかったパスフレーズが表示されます。
secret.txt.gpg:password123: ... (その他の情報) ...
1 password hash cracked, 0 left
解析速度について
GPGの暗号化(特にパスフレーズから鍵を導出するプロセス)は、意図的に計算コストが高くなるように設計されています。これは、ブルートフォース攻撃を困難にするためです。そのため、一般的なパスワードハッシュ(MD5やSHA1など)の解析と比較して、GPGパスフレーズの解析速度は非常に遅い傾向にあります。
あるテスト(2022年)では、CentOSサーバー(4スレッド)で AES256 暗号化された GPG ファイルに対して辞書攻撃を行ったところ、1秒あたり約10パスワード程度の試行速度でした。Windows 11マシン(i7-7700HQ, 8スレッド)では毎秒約35パスワードだったとの報告もあります。これは、CPU性能やスレッド数、GPGのバージョン、暗号アルゴリズムなどによって大きく変動します。GPU を利用できる場合 (JtRのOpenCL対応など) は速度向上が期待できますが、それでも他のハッシュタイプに比べると遅いことが多いです。🐢
したがって、複雑で長いパスフレーズの場合、解析には膨大な時間(数日、数年、あるいはそれ以上)がかかる可能性があります。
考慮事項とヒント
-
対応フォーマット:
gpg2john
は、主に共通鍵暗号 (gpg -c
) とパスフレーズ付き秘密鍵に対応しています。公開鍵で暗号化されたファイル(受信者の秘密鍵が必要なタイプ)のパスフレーズを直接解析するものではありません(秘密鍵ファイル自体のパスフレーズ解析は可能です)。 - 計算リソース: 前述の通り、GPGパスフレーズの解析は計算負荷が高いです。高性能なCPUやGPU、複数のコアを利用することで解析時間を短縮できます。John the RipperはOpenMPによるマルチスレッドや、OpenCLによるGPU利用に対応しています。
- 辞書ファイルの質: 辞書攻撃の成功率は、使用する辞書ファイルの質に大きく依存します。ターゲットが使いそうな単語、名前、誕生日、関連情報などを含むカスタム辞書を作成したり、インターネット上で公開されている大規模な辞書ファイル (CrackStation’s list など) を利用したりすることが有効です。
-
ルールの活用: John the Ripper の強力な機能の一つに「ルール (rules)」があります。これは、辞書ファイル内の単語に対して、大文字小文字変換、数字や記号の付加、単語の組み合わせなど、様々な変換を自動的に適用する機能です。
--rules
オプションで利用でき、単純な辞書攻撃よりも効果的な場合があります。 -
代替ツール: GPGハッシュの解析には、Hashcat という別の有名なパスワード解析ツールも利用できます。Hashcatは特にGPUを利用した高速な解析に強みがあります。
gpg2john
で抽出したハッシュ形式 (モード 17010 など) を Hashcat で利用することも可能です。
倫理と合法性について(再掲)
🚫 絶対に守ってください
この記事で紹介した技術やツールは、使い方によっては法に触れる可能性があります。
- 許可のないアクセスは厳禁: 自分自身が所有権を持つファイルやデータ、または明確な許可を得たシステム以外に対して、パスワード解析を試みることは絶対にしないでください。
- 法律の遵守: 不正アクセス行為の禁止等に関する法律(不正アクセス禁止法)や関連法規を必ず遵守してください。
- 教育と防御のために: これらの知識は、自身のパスワード強度を高めたり、システムのセキュリティを向上させたり、正当な目的(パスワードリカバリーなど)のために利用されるべきです。悪用は厳禁です。
技術の利用には、常に倫理的な責任が伴います。責任ある行動を心がけてください。🙏
まとめ
gpg2john
は、John the Ripper スイートの一部として、GPGで暗号化されたファイルや秘密鍵からパスフレーズ解析用のハッシュを抽出するための不可欠なツールです。
- GPGファイル (
gpg -c
で暗号化されたものや秘密鍵) を用意します。 gpg2john <GPGファイル> > <ハッシュファイル>
コマンドでハッシュを抽出します。- John the Ripper (
john
コマンド) にハッシュファイルを渡し、辞書攻撃やブルートフォース攻撃などでパスフレーズ解析を試みます (例:john --wordlist=<辞書ファイル> <ハッシュファイル>
)。 - 結果は
john --show <ハッシュファイル>
で確認できます。
GPGパスフレーズの解析は計算コストが高いため時間がかかることが多いですが、gpg2john
と John the Ripper の組み合わせは、パスワードリカバリーやセキュリティ監査において強力な手段となり得ます。ただし、その利用は常に倫理的かつ合法的な範囲にとどめる必要があります。✅
この記事が、gpg2john
の使い方を理解する一助となれば幸いです。😊
参考情報
- John the Ripper 公式サイト: https://www.openwall.com/john/ – JtR本体や関連ツールの情報源です。
- GnuPG 公式サイト: https://www.gnupg.org/ – GPGについての詳細情報はこちら。
コメント