签名和加密与加密和签名 - GPG 有什么作用?

签名和加密与加密和签名 - GPG 有什么作用?

我已经阅读了讨论我们应该先签名然后加密,还是先加密然后签名?和论文S/MIME、PKCS#7、MOSS、PEM、PGP 和 XML 中的签名和加密存在缺陷。我的问题与 gpg 正在做什么有关。这有点难以从经验上辨别,因为输出:

gpg --encrypt --sign <filename>

每次运行时都会发生变化。(为什么?)

@Jens 解释说部分原因是其中包含了时间戳。有什么方法可以消除它吗?我没有看到 gpg 选项。

由于选项的顺序可能没有什么区别,而且我无法使用该--detach-sign选项(无论如何都只生成一个输出文件),所以我怀疑输出代表:

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

其中$E_r$,是用收件人的公钥加密的,$E_s$是用发送者的私钥加密的,$msg$是消息,$\#msg$是消息的哈希值,$\|$是连接。IE。这将是“对消息进行签名然后加密”。这是正确的吗?

或者是:

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

换句话说,它是“先加密,然后使用纯文本签名”吗?我假设它是不是“加密然后签署密文”,($E_r (msg) \ \| \ E_s (\# E_r (msg))$)因为这与上面提到的论文中的第 1.2 节相反。

@Jens 解释说,这确实是“先签名然后加密”。那么我们如何“先加密然后使用纯文本签名”,输出单个 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>

每次运行时都会发生变化。(为什么?)

原因有二:

  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 消息。

相关内容