`gpg --symmetric` 可以产生可重现的输出吗?

`gpg --symmetric` 可以产生可重现的输出吗?

出于好奇,我想知道是否可以使用gpg --symmetric某种方式,即每次使用相同的密码(和算法)加密相同的数据都会产生相同的输出。

我运行了以下测试并得出结论,对同一个input文件进行两次加密会产生不同的输出文件:

$ head -c 100 /dev/urandom > input
$ gpg --symmetric --batch --passphrase test --yes -z0- -o out1.gpg input
$ gpg --symmetric --batch --passphrase test --yes -z0- -o out2.gpg input

$ sha1sum out1.gpg out2.gpg 
6047556b23549dfd6fc3c8766f7d2f00e60d1e4f  out1.gpg
1ad91b8937dc1718998291e76b501e643c6d452a  out2.gpg

我一直使用,-z0因为我知道压缩可能是改变输出的因素之一。来自man gpg“n 的值为 0 表示禁用压缩。”

是否还有其他标志对于获得可重现的输出是必要的?或者这根本就不是一个选项?

为了完整起见,如果这是可能的,那么为什么这可能是一个坏主意?

答案1

从理论上来说可以,但实际上程序的设计并未考虑到这一点。

首先,因为它使用的是 OpenPGP 格式,而 OpenPGP 是围绕杂交种加密(用户 RSA 密钥加密会话密钥),即使在对称模式下,它仍遵循相同的架构 - 您的密码不直接加密数据;它只加密“会话密钥”数据包,并且该会话密钥当然是随机生成的。理论上,您可以预先生成该会话密钥并从文件中提供它,但 GnuPG 没有提供此选项。

另一个不可复制性来源是用于 KDF(即用于将密码转换为实际加密密钥的“哈希算法”)的盐。同样,它通常是故意随机的。

适用于任何加密软件的最后一个因素是用于几乎所有密码模式;IV 的目的是确保密码以合理独特的状态启动。(对于某些密码模式,“独特”相当关键¹;对于其他密码模式则不那么重要。)

这是可能的使用基于某种形式的明文哈希的“合成 IV”获得可重现的密码输出(这样不同的输入仍将提供唯一的 IV,但相同的输入将获得相同的 IV)。但是,这是 GnuPG 本身需要在内部完成的事情,我认为它目前没有这样的选项。(例如,合成 IV 的一个缺点是程序必须缓冲整个输入以计算 IV,然后才能加密,而随机 IV 允许直接流式传输数据。)


¹(使用相同密钥加密不同输入时。如果相同的输入再次加密,非唯一 IV 仅仅表明“这绝对是相同的输入”,但是当不同的输入使用相同的密钥和 IV,这可能会造成严重后果,例如泄露实际密钥。)

相关内容