GnuPG 对称加密产生不同的输出

信息安全 加密 密码学 gnupg
2021-09-07 09:54:57

我有一个用例,我想使用 GnuPG 提交对称加密的源代码(想想Coursera的备份和协作作业)。我使用脚本批量加密/解密所有源,并且想知道为什么输出不稳定。

所以基本上,为什么

echo "plain text" | gpg --armor --symmetric --cipher-algo AES256

使用密码secret每次调用产生不同的密文?(当然,这不会影响解密 - 不同的密文可能会解密回相同的纯文本。)我对加密算法没有经验,但浏览Wikipedia 文章似乎该算法是确定性的。

简而言之,我的问题是:

  1. 这种行为是 AES 的属性还是我错误地使用了 GnuPG?
  2. 如果是前者,是否还有其他更适合此用例的对称加密算法?
3个回答

通常,对称加密从随机初始化向量 (IV) 开始。OpenPGP 使用稍微不同的密码反馈模式和全零 IV,但前两个块是随机的。

因此,对称加密也不是确定性的;您无法通过比较加密消息来比较纯文本,加密结果不再具有确定性。

除了加密初始化向量(IV) 之外,对称密钥派生还使用随机盐来防止离线字典或彩虹表攻击。具体来说,Iterated and Salted S2K ( String-to-Key ) 数据包包含一个 8 字节的 salt。

接近您的第二个问题,而不是使用不同的加密算法,您可以gpg在对称模式下替换为openssl

echo "plain text" | openssl enc -aes-128-cbc -nosalt -pass pass:secret

谨防:

  • 出于示例目的,我在命令行中提供了密码。有关提供它的更好方法,请参阅openssl(1) 中的PASS PHRASE ARGUMENTS

  • 由于我们明确禁用了盐,您应该使用一个不重复使用的更强大的密码短语,我会使用一个长的随机生成的密码短语,该密码短语会随着每个任务的变化而变化,