web-dev-qa-db-ja.com

署名と暗号化と暗号化と署名-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$はメッセージのハッシュ、$\|$は連結です。 ie。これは「sign-the-message-then-encrypt」になります。これは正しいです?

または代わりに:

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

言い換えれば、それは「平文を暗号化してから署名する」ということですか?それはnot「encrypt-then-sign-the-cyphertext」($E_r (msg) \ \| \ E_s (\# E_r (msg))$)であると想定しています。これは、セクション1.2のセクション1.2に反するためです。上記の論文。

@Jensは、それは確かに「sign-the-message-then-encrypt」であると説明しています。では、暗号化されたデータと署名の2つのファイルではなく、1つのopenpgpファイルを出力して「encrypt-then-sign-using-the-plain-text」を実行するにはどうすればよいでしょうか。

また、私は論文を読み、マニュアルを読みました-コード自体以外に、これを調べるためにどこに行きますか?

@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]
8
Diagon

これは、次の出力以来、経験的に識別するのが少し困難でした。

gpg --encrypt --sign <filename>

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

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

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

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

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

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

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

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

7
Jens Erat