签名和加密与加密和签名 - GPG做什么?


7

我已经阅读过讨论我们应该签名然后加密,还是加密然后签名?以及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$是邮件的哈希值,$\|$是连接。即。这将是“签署消息然后加密。”这是正确的吗?

或者是它:

\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]

我仍然对(嵌入式)问题的答案感兴趣。
对角线2016年

Answers:


7

由于以下方面的输出,这在经验上有点难以辨别:

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


添加了命令输出并请求澄清(迄今为止非常有用)的答案。
Diagon 2015年

@Diagon:您的编辑被拒绝,因为答案中的编辑并不意味着用于澄清请求。使用注释,或编辑原始问题(并确保保持在原始问题的范围内,否则请求新问题)。
Jens Erat 2015年

好的,我编辑了这个问题。似乎没有可能在评论中包含我试图发布的格式化输出,因此我之前的jerry-rigged解决方案。另外,我的问题直接与我(当前)问题的第一个链接中的crypto.stackexchange.com问题有关。因此,我不认为超级用户真的是正确的地方。此外,这里似乎没有Latex,所以我的问题现在有点像fubar。
Diagon 2015年

@JensErat你能告诉RFC在哪里解释加密和签名是允许的吗?会很好!不幸的是,我无法找到它。
efie 2017年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.