web-dev-qa-db-ja.com

暗号化した後、誰が私のGPGメッセージを復号化できるかを確認できますか?

たとえば、GPGを使用してファンネルケーキの素晴らしいレシピをアリスとボブに送信すると、どちらもそれを解読できると確信できます。しかし、私が確信できるのか、または事実の後に証明できるのは、彼らだけができることでしょうか。*

Context:これは簡単だと思いました:gpgメッセージには、可能な完全な暗号化キーIDのリストがあり、常に完全であることが保証されていました。しかし、それから--try-all-secrets gpg自体のオプションで、今はもうわかりません。オプションを正しく理解していれば、メッセージを復号化できるが、受信者の「公開」リストに含まれていないキーを持つことができます。 「公開」リストには、何かが起こっていることを示すためにすべて0のキーIDが含まれている場合がありますが、必ずしもそうである必要はないようです。それで、私は考えさせられました...

質問:誰かが私のバージョンのgpgを変更して、Eveを匿名の受信者として密かに追加したかどうかを(暗号化された出力のみに基づいて)知ることができますか?通知を受け取るには、受信者の1人である必要がありますか?

このシナリオが実際に発生することはおそらくないことを知っています。攻撃者がgpgバイナリを置き換えることができれば、このシナリオはおそらくあなたの心配の中で最も少ないでしょうが、私はまだ興味があります。


*:もちろん、秘密鍵が秘密に保たれていると仮定すると、誰もが勝者のレシピを共有するためにアリスに賄賂を贈ることはありません。

20
Wander Nauta

whoが特定のGPGファイルを確認して復号化できるかどうかは必ずしもわかりませんが、自分の秘密鍵と暗号化されたファイル自体は、何人の人ができるかを伝えることが可能です。

メッセージを暗号化すると、GPGは「セッションキー」と呼ばれるランダムな対称キーを生成し、それを使用してメッセージを暗号化します。次に、セッションキーの一連のコピーを作成し、各受信者に1つずつ、それぞれを異なる公開キーで暗号化します。次に、 OpenPGPコンテナー形式 を使用して、暗号化されたメッセージと共にこれらの暗号化された「キーパケット」をすべてパッケージ化します。

重要なことは、暗号化されたファイルしか持っていない場合、メッセージに到達するには、これらの暗号化されたセッションキーパケットの少なくとも1つを復号化できる必要があるということです。

gpg --list-packetsコマンドを使用して、暗号化されたファイル内のすべてのパケットを一覧表示できます。

$ gpg --batch --list-packets myfile.gpg
:pubkey enc packet: version 3, algo 16, keyid 0000000000000000
        data: [2048 bits]
        data: [2046 bits]
gpg: anonymous recipient; trying secret key ABCDE123 ...
:pubkey enc packet: version 3, algo 16, keyid 123ABCDE0987654F
        data: [2048 bits]
        data: [2046 bits]
:encrypted data packet:
...

--batchフラグは、GPGがパスフレーズを要求しないようにするため、何も復号化できません。GPGエージェントを実行している場合は、それ以上の時間がかかります。)

これらの「pubkey暗号化パケット」は、ファイルから読み取られた暗号化セッションキーパケットです。 「keyid 123ABCDE0987654F」のものが通常の受信者です。キーIDは、パケットの復号化に使用できるキーを示すヒントです。 "keyid 0000000000000000"のあるものは匿名の受信者です。どのキーで復号化されるかはわかりませんが、something。 Eveを匿名の受信者として追加するようにgpgを変更した場合、クリーンなgpgバイナリを使用して.gpgファイルを検査すると、これが表示されます。また、意図的に匿名の受信者を追加した場合にも表示されます。

ただし、イブがもう少し賢い場合は、受信者をさらに隠す方法がいくつかあります。

  • リストされたkeyid値は嘘である可能性があります。すべてゼロのkeyidは単なる規則であり、通常のkeyidは単なるヒントです。そこには何でもあり得ます。イブはボブのキーIDを使用して暗号化されたキーパケットにラベルを付け、ボブの正当なパケットを彼女に置き換えることができます。ボブにとってはパケットのように見えますが、ボブがそれを使用しようとすると、復号化は失敗します。これを確認できるのはボブだけです。 --try-all-secretsフラグはある程度関連しており、keyidが誤って間違っていた場合に役立ちます。
  • Eveは自分のキーパケットをファイルに入れる必要はなく、暗号化されたキーパケットを自分で作成する必要もまったくありません。機密データのないダミーファイルで--show-session-keyおよび--override-session-keyフラグを試してください。これらを使用すると、暗号化されたキーパケットにセッションキーを隠しておく代わりに、セッションキーを直接処理できます。 Eveがgpgバイナリを置き換えた場合、暗号化されたすべてのファイルのセッションキーと簡単に識別できるように暗号化されたデータのハッシュをメールで送ることができます。これは以前の「事前知識なし」の仮定に違反していますが、これらのフラグの存在が言及する価値があると感じました。
26
Jander

これを試して:

#gpg -d your_encrypted_file> /dev/null

gpg:2048ビットELGキーで暗号化、ID 245AC23E80C4A478、2005-12-17で作成] 
 「[email protected]」
 gpg:4096ビットのRSAキーで暗号化、ID CB6D005B993F02AB、作成日2020-04-08 
「[email protected]」
 gpg:4096ビットのRSAキーで暗号化、ID 8AB5B9CEB6F0B2D2、作成日2018-11-29 
 "Betty [email protected]" 

(-dフラグは、ファイルを復号化するためのものです。GPGが復号化すると、それは各キーの情報を画面に表示するSTDERRに送信します。通常の復号化の場合、STDOUTをファイルにリダイレクトしますが、この場合、実際にはファイルの内容は関係ないので、/ dev/nullにリダイレクトします。

0
AFC