署名と暗号化 vs. 暗号化と署名 - GPG は何をするのですか?

署名と暗号化 vs. 暗号化と署名 - GPG は何をするのですか?

私はすでに議論を読みました署名してから暗号化するべきでしょうか、それとも暗号化してから署名するべきでしょうか?そして紙S/MIME、PKCS#7、MOSS、PEM、PGP、XML における署名と暗号化の不具合私の質問は、gpg が何をしているかに関係しています。これは、次のような出力があるため、経験的に判別するのが少し困難です。

gpg --encrypt --sign <filename>

実行するたびに変わります。(なぜ?)

@Jens は、理由の一部はタイムスタンプが含まれているためだと説明しています。これを排除する方法はありますか? gpg オプションが表示されません。

オプションの順序はおそらく違いがなく、--detach-signオプションを使用できないため (いずれにしても出力のファイルは 1 つだけ生成される)、出力は次のようになると思われます。

\begin{equation}
E_r (msg\  \| \ E_s (\#msg))
\end{equation}

ここで、$E_r$は受信者の公開鍵による暗号化、$E_s$は送信者の秘密鍵による暗号化、$msg$はメッセージ、$\#msg$はメッセージのハッシュ、 は$\|$連結です。すなわち。これは「メッセージに署名してから暗号化する」ということになります。これは正しいでしょうか?

それとも代わりに:

\begin{equation}
E_r (msg) \  \| \ E_s (\#msg)
\end{equation}

言い換えれば、「暗号化してから平文で署名する」ということでしょうか?私はそうだと思いますない「暗号文を暗号化してから署名する」($E_r (msg) \ \| \ E_s (\# E_r (msg))$)というのは、上記の論文のセクション 1.2 に反するからです。

@Jens は、確かに「メッセージに署名してから暗号化する」と説明しています。では、暗号化されたデータと署名の 2 つのファイルではなく、単一の openpgp ファイルを出力するにはどうすればよいでしょうか。

また、論文も読みましたし、マニュアルも読みました。コード自体以外で、これを調べるにはどこに行けばいいのでしょうか?

@Jens は実行を提案しました:

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets 

自分自身に暗号化して実行したところ、以下の出力が見つかりました。これが何を意味するのか、誰か説明してもらえませんか?

[...]
gpg: okay, we are the anonymous recipient.
:encrypted data packet:
    length: unknown
    mdc_method: 2
gpg: encrypted with RSA key, ID 00000000
:compressed packet: algo=2
:onepass_sig packet: keyid C6701618143AFA1E
    version 3, sigclass 0x00, digest 10, pubkey 1, last=1
:literal data packet:
    mode b (62), created 1443494042, name="",
    raw data: 4 bytes
:signature packet: algo 1, keyid C6701618143AFA1E
    version 4, created 1443494042, md5len 0, sigclass 0x00
    digest algo 10, begin of digest d7 3a
    hashed subpkt 2 len 4 (sig created 2015-09-29)
    subpkt 16 len 8 (issuer key ID C6701618143AFA1E)
    data: [4095 bits]

答え1

これを経験的に判別するのは少し困難でした。なぜなら、次のような出力があったからです。

gpg --encrypt --sign <filename>

実行するたびに変わります。(なぜですか?)

これには 2 つの理由があります。

  1. OpenPGPの対称暗号化では、ランダムな初期化ベクトル(または、固定された初期化ベクトルを持つ同様の構造)が使用されます。
  2. 署名作成タイムスタンプが含まれます。

署名と暗号化 vs. 暗号化と署名 - gpg は何をしますか?

GnuPG はまずメッセージに署名し、次にそれを暗号化します。これを確認するには、次を使用しますgpg --list-packets

echo 'foo' | gpg --recipient [key-id] --encrypt --sign | gpg --list-packets

パケットの順序が示すように、最初にメッセージに署名し、次にメッセージを暗号化します。

私の理解ではRFC 4880、OpenPGPただし、両方の順序が定義されています。OpenPGP メッセージは署名、暗号化、圧縮、リテラル データにすることができますが、署名は OpenPGP メッセージに適用され、復号化されたメッセージも OpenPGP メッセージを形成する必要があります。

関連情報