如何隐藏/检测使用的 PGP 对称算法

信息安全 AES pgp 混淆 算法 gnupg
2021-08-12 20:52:55



当对称加密文件时(不是签名,不是非对称加密问题),是否可以隐藏使用的加密算法,或者它是否已经隐藏,但由于以某种方式缓存而仅显示在系统上?

类比:签署加密文件时,可以隐藏收件人 ID。但是如何隐藏使用 GnuPG 进行对称加密时使用的加密算法(在本例中为 gpg4win)?


示例:
gpg --armor --symmetric --cipher-algo AES256 --output encryptedOutputFile.asc unencryptedInputFile.txt


然后:
gpg --decrypt plaintextfile.txt

产生:
gpg:AES256 加密数据
gpg:使用 1 个密码短语加密


观察:

不知何故,gpg4win 甚至在输入密码之前就使用 Space Magic 来推断对称算法是什么。这是怎么发生的?我试图消除算法存在于缓存中的可能性,但仍在推断中。GPG默认使用CAST5,那么它是如何推断AES256的呢?

那么,即使在指定密码之前,GPG 是如何推断使用 AES256 的呢?

有没有办法隐藏与 gpg -- 标志一起使用的算法?

谢谢!

2个回答

请注意,如果您使用适当强的密码/密钥,则没有正当理由隐藏所使用的算法。

如果您真的担心,您可以在十六进制编辑器中打开加密文件并更改对称加密的 ASCII 装甲文件的第四个字节。

例如,对称加密文件的前四个字节是:

8C 0D 04 09

第四个字节是 09,表示 AES256。查看 common/openpgpdefs.h 以查看其他值:

typedef enum
  {
    CIPHER_ALGO_NONE        =  0,
    CIPHER_ALGO_IDEA        =  1,
    CIPHER_ALGO_3DES        =  2,
    CIPHER_ALGO_CAST5       =  3,
    CIPHER_ALGO_BLOWFISH    =  4, /* 128 bit */
    /* 5 & 6 are reserved */
    CIPHER_ALGO_AES         =  7,
    CIPHER_ALGO_AES192      =  8,
    CIPHER_ALGO_AES256      =  9,
    CIPHER_ALGO_TWOFISH     = 10, /* 256 bit */
    CIPHER_ALGO_CAMELLIA128 = 11,
    CIPHER_ALGO_CAMELLIA192 = 12,
    CIPHER_ALGO_CAMELLIA256 = 13
  }
cipher_algo_t;

所以如果你把字节改成0a(十进制10),它会认为我用了twofish而不是aes256。在我将字节改回 09 之前,无法使用 gpg 解密。

在改变之前,我看到:

$ gpg -d some_file.gpg 
gpg: AES256 encrypted data
Enter passphrase: 

在更改该字节后,我看到:

$ gpg -d some_file.gpg 
gpg: TWOFISH encrypted data
Enter passphrase: 

当然,这只会增加模糊性并迫使您记住将字节改回并大大降低可读性。我不建议你这样做。

看起来用于加密消息的密码是用 AES256 加密的。在加密的会话密钥包被解密之前,用于加密消息的算法是未知的。

这是 pgpdump 显示的内容:

Old: Symmetric-Key Encrypted Session Key Packet(tag 3)(13 bytes)
New version(4)
Sym alg - AES with 256-bit key(sym 9)
Iterated and salted string-to-key(s2k 3):
    Hash alg - SHA1(hash 2)
    Salt - f8 8d cc 5f 67 70 ee 2a 
    Count - 65536(coded count 96)
New: Symmetrically Encrypted and MDC Packet(tag 18)(294 bytes)
Ver 1
Encrypted data [sym alg is specified in sym-key encrypted session key]
    (plain text + MDC SHA1(20 bytes))

Symmetric-Key Encrypted Session Key Packet 包含“描述使用的对称算法的一个八位字节数”(参见RFC 4880)。似乎需要加密会话密钥的算法(除非您想破坏 RFC)

看起来您无法禁止添加用于加密密码的算法。