最近、GPG と格闘していましたが、ようやく (ついに!) 動作するようになりました。これで、暗号化された BLOB を gpg.exe に入力して、プレーンテキスト バージョンを出力できます。もちろん、有効な暗号化 BLOB である (つまり、その復号化キーが秘密キー/「暗号 ID」のリストにある) ことが前提です。
私の質問は、GPG はこれらのキーのどれを試すかを正確にどのように決定するのかということです。その情報は暗号化 BLOB に何らかの形で組み込まれているのでしょうか。それとも、正常に復号化されるまで、1 つずつ盲目的に試すだけなのでしょうか。
この質問にようやく答えが得られたならうれしいです。長い間疑問に思っていたからです。このようにすべてを調べるのは、とても「粗雑」で「ローテク」な気がします。特に、たとえば、何千人もの人の秘密鍵を調べて、新しい受信メッセージがそれらのいずれかに一致するかどうかを確認する必要があるようなサービスをホストし始めたら。それは「拡張可能」ではないようです。
暗号化されたテキストの中に、GPG にどのキーを試すべきかを知らせる何かがあることを期待します。そうなのでしょうか?
答え1
結果として得られるOpenPGPパケットには、暗号化サブキーID受信者がそれを復号化できると想定します。例:
$ date | gpg --encrypt | pgpdump
Old: Public-Key Encrypted Session Key Packet(tag 1)(524 bytes)
New version(3)
Key ID - 0xCE7B0F19551034EF
Pub alg - RSA Encrypt or Sign(pub 1)
...
New: Symmetrically Encrypted and MDC Packet(tag 18)(83 bytes)
...
受信者が複数いる場合は、複数の「セッション キー」パケットが存在します。受信者ごとに 1 つずつあり、すべてのパケットは同じ対称キーの異なる暗号化バージョンを保持します。
(仕様の次のバージョンである v5 では、代わりに完全なサブキー フィンガープリントが計画されていると思います。ただし、この状況では、切り捨てられたキー ID で十分です。)
そうは言っても、GnuPG には と呼ばれるオプションがあり--throw-keyids
、これにより、すべてのセッション キー パケットが同じキー ID 0x00000000000000000 を持つようになります。その場合、受信者は実際に、自分が持っているすべての秘密の暗号化対応サブキーを使用して、ブルート フォースでパケットを復号化しようとします。
同様に個々の受信者を非表示にするオプションもあるため--hidden-recipient
、結果のメッセージに null キー ID と null 以外のキー ID を混在させることができます。これは、Bcc:
電子メール クライアントでカーボン コピーを実装する場合に役立つ可能性があります。
どちらのオプションも、公開掲示板、ドロップ ボックス、サブレディットなどを通じてメッセージを交換する必要があり、宛先の受信者を明らかにしたくない場合に使用できます。
$ date | gpg -e --recipient Alice --hidden-recipient Robert | gpg --list-packets
gpg: anonymous recipient; trying secret key CE7B0F19551034EF ...
gpg: anonymous recipient; trying secret key DCDBB36BD91759A3 ...
gpg: okay, we are the anonymous recipient.
gpg: encrypted with 4096-bit RSA key, ID CE7B0F19551034EF, created 2009-10-31
gpg: encrypted with RSA key, ID 0000000000000000
# off=0 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
data: [4095 bits]
# off=527 ctb=85 tag=1 hlen=3 plen=524
:pubkey enc packet: version 3, algo 1, keyid CE7B0F19551034EF
data: [4092 bits]
# off=1054 ctb=d2 tag=18 hlen=2 plen=80 new-ctb
:encrypted data packet:
...