PGP/GPG 文件的前 4 个字节是省略号、微笑、女性符号和心脏,这是巧合吗?

信息安全 pgp gnupg
2021-08-19 16:31:46

正如标题所说,这 4 个字节是否具有含义(我认为它们的含义显然是微笑会根据键位数而变化)?

下面的两个文件已使用不同的密钥加密,但在同一个密钥中,这 4 个字节始终相同。

如果这 4 个字节始终相同,那么 PGP/GPG 中是否有任何内置方法可以防止攻击者知道他们可能已经获取/拦截了哪些文件,而不是在传输过程中剥离这些字节并在目的地重新创建它们?

在此处输入图像描述 在此处输入图像描述

3个回答

是的,第一个字节在您看来是这些符号,这是一个巧合。它们是 OpenPGP 消息格式规范 ( RFC 4880 ) 的一部分,并因数据包属性而异。

让我们创建一个仅包含这些字节的文件并尝试将其作为 GPG 消息读取:

$ echo " \x85\x02\x0c\x03 " > foo.gpg && gpg --list-packets foo.gpg
# off=0 ctb= 85 tag=1 hlen=3 plen= 524 
:pubkey enc packet: version 3 , algo 255, keyid 0AFFFFFFFFFFFFFF
    不支持的算法 255
  • 第一个字节 ( 0x85 = 0b10000101) 是描述数据包类型的密码类型字节 (CTB)。我们可以将其分解如下
    1::CTB 指示位
    0:旧数据包格式(参见RFC 1991
    0001:公钥加密数据包
    01:数据包长度字段为 2 个字节长

  • 第二个和第三个字节表示数据包长度(0x020c = 524)。

  • 第四个字节 ( 0x03) 表示它采用版本 3 数据包格式。

如您所见,这些字节是有意义的,而不是您可以删除而不会丢失信息的幻数常量。如果你切断它们,你正在破坏 GPG 数据包,并且需要一些猜测来重建它。


这些字节显示为笑脸和心形,因为这就是您的(可能是 DOS)终端显示不可打印控制字符的方式。在源自代码页 437的字符集中,可打印 ASCII 范围之外的低字节传统上表示为图标。CP437这是 IBM PC 上的原件:

在此处输入图像描述

(图片来源)

作为一般原则,精心设计的二进制文件格式¹的前几个字节将是一个标识格式的幻数。ELF 可执行文件的前四个字节始终为 7f 45 4c 46,PNG 文件的前八个字节始终为 89 50 4e 47 0d 0a 1a 0a,依此类推。精心设计的加密文件格式将始终遵循带有未加密“标头”的幻数,该标头揭示了加密算法、加密数据的长度等。

这通常不被认为是安全漏洞,因为Kerckhoffs 原则指出,即使攻击者知道文件头可以告诉他们的所有内容(例如算法),密码系统也需要安全。

可以设计一种文件格式或协议,除非您已经知道解密密钥,否则其所有字节都与随机性无法区分,但这非常困难(您是否知道加密预期长度的加密数据会引入漏洞?)它实际上并没有给你带来任何好处。一个与输出完全无法区分的文件对于秘密警察cat /dev/random来说就像一个明显的 GPG 加密文件一样可疑。甚至可能可疑,因为加密文件有各种无害的理由。

如果您担心攻击者仅仅知道您正在使用加密与某人通信,您需要隐写术,它将秘密信息隐藏在普通的未加密文件中。请注意,隐写术的最新技术并不像密码学的最新技术那样复杂;最后我检查了一下,所有已知的方法都可以被一个坚定的对手破坏。(如果秘密警察的第一印象是“哦,这是一张充满假期照片的存储卡”,他们可能不会费心去深入挖掘......除非他们已经有理由怀疑你。)


¹ 我对 GPG 文件格式是否经过精心设计没有意见。

您所看到的“省略号、微笑、女性符号和心形”是根据所选代码页向您显示的符号。键入chcp以找出您的活动代码页。对于相同的字节码,您将在不同的代码页上获得不同的符号。

魔术位就像指示文件类型的 ID 标签,例如某些操作系统。MacOS 依赖于 vs Windows(更喜欢文件扩展名,尽管某些文件(例如.exe文件)总是在运行时引用它们的魔法位)。

在您的 scnshots 中,二进制代码是不同的,尽管您在文件显示中看到类似的符号。

回答您的问题:是的,在这种情况下这是“巧合”(基于您的代码页),而不是“始终相同”。

加密的想法是攻击者可能知道文件的类型,但无法(实际上)破译已加密的内容,因此您不需要“剥离这些字节”。