如果我用 GnuPG 对同一个文件加密两次,使用相同的密钥,我会得到相同的结果吗?还是使用一些随机/伪随机段来提高安全性,如 rsynccrypto?
使用 GnuPG 和相同的密钥加密相同的文件会产生相同的密文吗?
一般来说,不,用相同的密钥加密相同的文件不会产生相同的文件,原因有以下三个:
OpenPGP 格式(由GnuPG 实现)使用混合加密:随机的对称密钥使用接收者的公钥(RSA 或 ElGamal 类型)加密,并且该对称密钥本身用于使用对称加密算法加密消息正文。使用混合加密是因为非对称加密的范围非常有限(例如,2048 位 RSA 密钥一次不能加密超过 245 个字节)并且开销很大(CPU 和生成的消息大小)。由于对称密钥没有保存在发送方的任何地方,因此每次都会创建一个新的随机密钥,并且以压倒性的概率不同。
非对称加密本身是随机的。例如,对于RSA,填充包括随机字节。这是“一般”需要的,因为公钥是公开的,所以每个人都知道;如果加密是确定性的,攻击者可以对消息进行详尽的搜索。这在 OpenPGP 的特定情况下不会成为问题(消息是一个随机密钥,大到足以自行击败穷举搜索),但 RSA 或 ElGamal 的标准具有更大的范围并包括随机填充。
在进行对称加密本身时,会使用随机 IV,并且每次调用都会不同(以压倒性的概率)。有关详细信息,请参见第 5.7 节。
第三点也适用于进行基于密码的加密(加密是使用密码完成的,而不是使用收件人的公钥)。基于密码的加密还添加了第四种随机化,即密码到密钥转换中的盐。
GnuPG 加密不是确定性的,因此每次运行都会返回不同的输出。加密,然后解密当然是确定性的,并且总是返回相同的内容。
解释:
GnuPG 使用非对称加密,在加密大量数据时速度很慢。出于这个原因,它使用您的私钥来加密一个随机分组密码,该密码再次用于加密您的数据。
每次加密数据时,都会生成一个新的随机分组密码,因此加密后的数据看起来会有所不同。
我对同一个文档进行了两次加密,并在每次加密后计算了 MD5 校验和:
$ gpg --encrypt test.txt
$ md5 test.txt.gpg
MD5 (test.txt.gpg) = f2f6a07e0d7ae9899315d0471c2596bc
$ gpg --encrypt test.txt
$ md5 test.txt.gpg
MD5 (test.txt.gpg) = b57d4c360b1c3c6b2202ce6c3d32cdd8