从 OpenPGP 加密文件中泄露了哪些信息?

信息安全 pgp
2021-09-03 02:25:01

如果攻击者获得了使用 OpenPGP 公钥加密的文件,攻击者可以推断出哪些信息?

例如,攻击者可以在多大程度上推断出预期接收者的身份?

2个回答

收件人的密钥 ID 以明文形式包含在加密文件中。其他“隐藏在视线中”的可能有趣的信息只是文件的大小,或者加密文件的名称(如果有人只是发送它而没有改变当然。)

您可能没有意识到收件人密钥 ID 实际上是一个可选字段。第 5.1 节继续说:

实现可以接受或使用零密钥 ID 作为“通配符”或“推测”密钥 ID。在这种情况下,接收实现将尝试所有可用的私钥,检查有效的解密会话密钥。这种格式有助于减少对消息的流量分析。

您可以使用-R( 或--hidden-recipient) 标志进行加密gpg以避免在加密消息中泄露收件人的公钥。

$ gpg -e -R torvalds@linux-foundation.org message.txt
$ $ gpg --verbose --verbose --decrypt message.txt.gpg 
:pubkey enc packet: version 3, algo 1, keyid 0000000000000000
    data: [2047 bits]
gpg: public key is 00000000
gpg: anonymous recipient; trying secret key aaaaaaaa ...
gpg: anonymous recipient; trying secret key bbbbbbbb ...
gpg: anonymous recipient; trying secret key cccccccc ...

:encrypted data packet:
    length: 76
    mdc_method: 2
gpg: encrypted with RSA key, ID 00000000
gpg: decryption failed: secret key not available
$

至此,它gpg会遍历所有试图获取有效会话密钥的私钥,因为它无法识别用于加密的公钥。但是,如果攻击者有权访问大量消息,请参阅此答案以了解区分收件人的方法。

一个实用的旁白——次要线索可能在各种日志中。例如,获得此类消息的攻击者也可能能够访问(例如).bash_history具有收件人地址文件,或者具有 IP 地址的 Web 服务器日志,这些 IP 地址提供了谁发布或获取文件的线索等。

根据OpenPGP 消息格式的 RFC 第 5.1 节,每条 OpenPGP 加密消息都包含至少一个 Public-Key Encrypted Session Key Packet,它本身包含以下纯文本信息:

  • 用于加密消息的公共(子)密钥的密钥 ID,八位字节长。这可以用来推断预期接收者的身份
  • 一个八位字节的数字,标识所使用的公钥算法
  • 数据包类型的版本号

如果指定了多个接收者,则将存在多个公钥加密会话密钥包,每个预期接收者一个。

因此,总而言之,攻击者可以根据 OpenPGP 加密消息缩小目标接收者的身份。

您可以通过尝试解密您没有公钥的文件来通过实验向自己证明这一点。如您所见,预期收件人的密钥 ID,以及算法名称和版本号:

$ gpg --encrypt -r '<recipient1@example.com>' -r '<recipient2@example.com>' --sign message.txt
$ GNUPGHOME=/tmp/empty gpg --verbose --verbose --decrypt message.txt.gpg
:pubkey enc packet: version 3, algo 16, keyid 9759103664E69CC1
    data: [2048 bits]
    data: [2047 bits]
gpg: public key is 64E69CC1
:pubkey enc packet: version 3, algo 16, keyid 9478F6114164312C
    data: [2048 bits]
    data: [2048 bits]
gpg: public key is 4164312C
:encrypted data packet:
    length: 171
    mdc_method: 2
gpg: encrypted with ELG-E key, ID 4164312C
gpg: encrypted with ELG-E key, ID 64E69CC1
gpg: decryption failed: secret key not available

这是可用的纯文本信息。我不知道它们是否是可以统计推断的任何其他信息。