
秘密の GPG キーのパスフレーズを忘れてしまったので、それをエクスポートして、可能性のあるいくつかのパスフレーズを使ってブルートフォース攻撃を仕掛けたいと思っています。
ただし、 を実行すると、gpg --export-secret-keys
gpg に指定したオプションに関係なく、gpg-agent は常にパスフレーズを要求します。--batch
、--yes
、 は--passphrase-fd
効果がありません。
GPG 2.1.15 を実行しています。
GPG 2.0.22 を実行しているマシンで秘密鍵をエクスポートしてみましたが、問題はありませんでした。まだこれを行うことは可能ですか?
そうでなければ、鍵は紛失したことになります。
答え1
次のように、復号化せずに「手動で」キーを転送できます。
# create temporary destination dir
mkdir -m 700 /tmp/alt-gnupg
# transfer public keys using export/import, assuming name "user-000"
gpg2 --export user-000 | gpg2 --homedir /tmp/alt-gnupg --import
# transfer private keys using file copy
for g in $(gpg2 --list-keys --with-keygrip --with-colons 'user-000' |
awk -F: '$1=="grp" {print $10}'); do
cp ~/.gnupg/private-keys-v1.d/$g.key /tmp/alt-gnupg/private-keys-v1.d
done
# check you got them
gpg2 --homedir /tmp/alt-gnupg --list-secret-keys
これが機能するのは、秘密鍵が という形式のファイルに保存されており<keygrip>.key
、ロックを解除しなくてもキーグリップを見つけることができるためです。
キーを総当たり攻撃するには:
# use alternate gnupg dir
export GNUPGHOME=/tmp/alt-gnupg
# create dummy encrypted file
echo hello |
gpg2 --encrypt --recipient user-000 --armor >/tmp/msg.asc
# tell gpg-agent to accept loopback pinentry
echo allow-loopback-pinentry >${GNUPGHOME}/gpg-agent.conf
# restart gpg-agent
gpg-connect-agent /bye
# and now...
for p in pass1 pass2; do
gpg2 --batch --pinentry-mode=loopback --passphrase "$p" --quiet --decrypt /tmp/msg.asc >/dev/null 2>&1 && echo "yes!! pass: $p"
done