在 gpg 中,"decrypting" 没有 public 密钥的签名消息
In gpg, "decrypting" a signed message without the public key
我知道如何使用 gpg 对消息进行签名或验证来自其他人的签名消息。但我最近注意到,您可以 "decrypt" 签名邮件而无需访问他们的 public 密钥 [尽管您无法验证签名]。
例如,这是一条小签名消息。
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1
owEBrAJT/ZANAwACAULhWJW/fwKRAax8YgdtZXNzYWdlWFVuX0hlbGxvIFN0YWNr
T3ZlcmZsb3cuCgpZb3UgY2FuIHJlYWQgdGhpcyBtZXNzYWdlLCBldmVuIHRob3Vn
aCB5b3UgZG9uJ3QgaGF2ZSBteSBwdWJsaWMga2V5LiBIb3cgZG9lcyB0aGF0IHdv
cms/CokCHAQAAQIABgUCWFVuXwAKCRBC4ViVv38CkXl6D/oCvgOGKFx7c0IDAI9q
2wsj35bapllGlxCRK5/Z8sYqM2RpcV+//wArozMTndFj60ZevMIrPYyWEUyKYS6l
kgq6euD2hbcoy/bcP/3z51K3zCtXby4/CKgx6E1ecC94iO89hVoYQkLWtgRWiL8Z
wfGWgr8X0MaGzsU5q/SchJfZj5ox32JN0S8Iqfqk+xJe2CdQ4KRpbS3M5I3u8/yX
E5ETUeO3aFPwmrBysJysGozWatoiDlMvuiLfnW+Qs4DkEpSRxOw2Sx+ufE2wmWlJ
+5Q4OJiEL6TmJ+Di201CHDGFPWVkrGDioMt6x07vyyiW6X2k4vmIjbFL9vtypUfF
4VzzCWRX9BTCVZZo4ULUmkNznF1IkYJ03TlEFqfTrQ6Jq3SeqlzjGY3I4LJ1a9cL
eobIECLFLqTmOmXM5oC/38V2kNA+/NoSNkw+H78sIlfQ8919JktVG+oa6mEP2OQ8
7k3W7nSpcKugGYDXBB5HQa8lPq1lgI9H+j05pCAhoNnff6Ynl223ycva0xq5wOs/
mjViRWDn+RUebp3KcN/PW7Bkf9RsKt/sPJl2IPdDwdaBibUkhIEKfWVpaOd9rlK6
06/bD+momYpXSlmE/eYh+pf8aIj2R+7Ciz8fAqrTU2hPSWoi2Ne/ISwLBJS4wmRZ
OnHYDOXulQBor1K+VgKyYclC2Q==
=5/kF
-----END PGP MESSAGE-----
与许多签名邮件不同,此邮件不是纯签名的。我原以为如果不能访问此消息的 public 密钥,就无法阅读它,更不用说验证它了。
但是如果在这条消息上使用gpg --decrypt
,它能够产生明文版本。或者,如果您对 gpg 使用 Keybase 之类的服务,那么 Keybase 也能够生成明文。究竟是怎么回事?
第一个想法是 public 密钥以某种方式包含在消息中,但事实并非如此。 public 密钥的指纹已包含在内,尽管这不足以解密消息,对吗?
具有 --sign --armor
的 GPG 生成 base64 编码(更准确地说 Radix-64-encoded)输出,其中消息正文通过简单的 base64 解码输出仍然可读。
所以我猜另一种表达方式是消息是编码但未加密。
要通过任何 base64 解码器(例如,some online one)查看问题中的 运行 PGP 消息。
因为消息没有加密而只是签名,所以不需要密钥来解密。它只是一个签名和一些包裹在一起的文本。所以 GPG 不需要密钥就可以解开它。
这里的“裹”字就是shorthand。这里有更详细的解释:
- 每个 PGP 消息都包含一组 the OpenPGP spec calls “packets”
- 对于
--sign
输出,GPG 对包含 (1) Literal Data Packet that holds the message body and (2) a Signature Packet 的消息进行编码
- 当
--decrypt
ing --sign
输出时,GPG只是对其进行解码;它解码文字数据包部分以获得(未加密的)消息体和签名包部分以获得签名
因此,如果收件人想要根据签名检查消息文本,他们只需要密钥。他们不需要密钥就可以阅读消息。他们只需要 GPG 或理解如何解码消息格式的 OpenPGP Message Format standard 的其他实现。
就加密而言,--sign
ed 消息与使用 --clearsign
签名的消息没有区别。两者都没有加密。唯一的区别是,对于使用 --sign
签名的消息,收件人需要使用 GPG 从签名中解包文本,而对于使用 --clearsign
签名的消息,收件人可以看到消息文本无需 GPG。
除了已接受的答案之外,即使邮件已加密 - 也可以使用您的 public 密钥进行加密,并且由于您拥有私钥,因此可以对其进行解密。签名和验证的唯一目的是 'prove' 向您发送消息的人。如果您不在乎它来自谁,您仍然可以通过忽略签名来解密发送给您的任何 PGP 消息 - 您只是不能确定它来自您认为它来自的人。
我知道如何使用 gpg 对消息进行签名或验证来自其他人的签名消息。但我最近注意到,您可以 "decrypt" 签名邮件而无需访问他们的 public 密钥 [尽管您无法验证签名]。
例如,这是一条小签名消息。
-----BEGIN PGP MESSAGE-----
Version: GnuPG v1
owEBrAJT/ZANAwACAULhWJW/fwKRAax8YgdtZXNzYWdlWFVuX0hlbGxvIFN0YWNr
T3ZlcmZsb3cuCgpZb3UgY2FuIHJlYWQgdGhpcyBtZXNzYWdlLCBldmVuIHRob3Vn
aCB5b3UgZG9uJ3QgaGF2ZSBteSBwdWJsaWMga2V5LiBIb3cgZG9lcyB0aGF0IHdv
cms/CokCHAQAAQIABgUCWFVuXwAKCRBC4ViVv38CkXl6D/oCvgOGKFx7c0IDAI9q
2wsj35bapllGlxCRK5/Z8sYqM2RpcV+//wArozMTndFj60ZevMIrPYyWEUyKYS6l
kgq6euD2hbcoy/bcP/3z51K3zCtXby4/CKgx6E1ecC94iO89hVoYQkLWtgRWiL8Z
wfGWgr8X0MaGzsU5q/SchJfZj5ox32JN0S8Iqfqk+xJe2CdQ4KRpbS3M5I3u8/yX
E5ETUeO3aFPwmrBysJysGozWatoiDlMvuiLfnW+Qs4DkEpSRxOw2Sx+ufE2wmWlJ
+5Q4OJiEL6TmJ+Di201CHDGFPWVkrGDioMt6x07vyyiW6X2k4vmIjbFL9vtypUfF
4VzzCWRX9BTCVZZo4ULUmkNznF1IkYJ03TlEFqfTrQ6Jq3SeqlzjGY3I4LJ1a9cL
eobIECLFLqTmOmXM5oC/38V2kNA+/NoSNkw+H78sIlfQ8919JktVG+oa6mEP2OQ8
7k3W7nSpcKugGYDXBB5HQa8lPq1lgI9H+j05pCAhoNnff6Ynl223ycva0xq5wOs/
mjViRWDn+RUebp3KcN/PW7Bkf9RsKt/sPJl2IPdDwdaBibUkhIEKfWVpaOd9rlK6
06/bD+momYpXSlmE/eYh+pf8aIj2R+7Ciz8fAqrTU2hPSWoi2Ne/ISwLBJS4wmRZ
OnHYDOXulQBor1K+VgKyYclC2Q==
=5/kF
-----END PGP MESSAGE-----
与许多签名邮件不同,此邮件不是纯签名的。我原以为如果不能访问此消息的 public 密钥,就无法阅读它,更不用说验证它了。
但是如果在这条消息上使用gpg --decrypt
,它能够产生明文版本。或者,如果您对 gpg 使用 Keybase 之类的服务,那么 Keybase 也能够生成明文。究竟是怎么回事?
第一个想法是 public 密钥以某种方式包含在消息中,但事实并非如此。 public 密钥的指纹已包含在内,尽管这不足以解密消息,对吗?
具有 --sign --armor
的 GPG 生成 base64 编码(更准确地说 Radix-64-encoded)输出,其中消息正文通过简单的 base64 解码输出仍然可读。
所以我猜另一种表达方式是消息是编码但未加密。
要通过任何 base64 解码器(例如,some online one)查看问题中的 运行 PGP 消息。
因为消息没有加密而只是签名,所以不需要密钥来解密。它只是一个签名和一些包裹在一起的文本。所以 GPG 不需要密钥就可以解开它。
这里的“裹”字就是shorthand。这里有更详细的解释:
- 每个 PGP 消息都包含一组 the OpenPGP spec calls “packets”
- 对于
--sign
输出,GPG 对包含 (1) Literal Data Packet that holds the message body and (2) a Signature Packet 的消息进行编码
- 当
--decrypt
ing--sign
输出时,GPG只是对其进行解码;它解码文字数据包部分以获得(未加密的)消息体和签名包部分以获得签名
因此,如果收件人想要根据签名检查消息文本,他们只需要密钥。他们不需要密钥就可以阅读消息。他们只需要 GPG 或理解如何解码消息格式的 OpenPGP Message Format standard 的其他实现。
就加密而言,--sign
ed 消息与使用 --clearsign
签名的消息没有区别。两者都没有加密。唯一的区别是,对于使用 --sign
签名的消息,收件人需要使用 GPG 从签名中解包文本,而对于使用 --clearsign
签名的消息,收件人可以看到消息文本无需 GPG。
除了已接受的答案之外,即使邮件已加密 - 也可以使用您的 public 密钥进行加密,并且由于您拥有私钥,因此可以对其进行解密。签名和验证的唯一目的是 'prove' 向您发送消息的人。如果您不在乎它来自谁,您仍然可以通过忽略签名来解密发送给您的任何 PGP 消息 - 您只是不能确定它来自您认为它来自的人。