假设我使用 GPG 加密了一个(可能很大的)文件;例如
gpg --recipient "Some Name" -o this_file.gpg --encrypt this_file.txt
是否可以在不先解密文件,然后再进行另一次加密的情况下添加另一个收件人?
答案1
简短回答:不
首先,请注意,如果您不是收件人之一,这完全是不可能的。您甚至没有能力解密文件,更不用说添加收件人了。即使您在两秒前加密了它。
假设您是收件人,从技术上讲这是可行的。该文件实际上是用会话密钥加密的,而会话密钥又用您的公钥加密,因此您可以理论上解密会话密钥并将其重新加密为另一个人的密钥,然后将所有内容打包到一个文件中,就像您最初将文档加密给两个人一样。
然而,gpg 没有这个功能. 使用 gpg 可以得到最接近的结果
- 使用该
--show-session-key
选项获取会话密钥(这似乎也可以解密文件,但在这种情况下忽略了重点) - 将该会话密钥加密为其他人的公钥(实际上,这会创建一个新的会话密钥,并使用该会话密钥加密原始会话密钥)
- 发送两个文件。
- 接收者可以解密会话密钥并用来
--override-session-key
解密原始消息。
答案2
1) 这种情况就是为什么加密文件给自己(以及预期的收件人)总是一个好主意。RedGrittyBrick 在上面正确地描述了 GPG 和 PGP 的工作原理,这与 nathang 上面的回答相吻合。
2) 但是,如果您有原始文件,最好直接为新收件人创建一个新的加密文件。
假设您不想按照 nathang 的建议采用会话密钥路由,如果您首先将文件加密为自己(如上文#1 所示),则请对其进行解密,然后按照上面的步骤#2 进行操作。
如果您既没有原件,也没有对您自己进行加密,那么您就无法取回数据,并且除非第一个收件人向您发回副本,否则您无法将其加密给任何其他人。
答案3
是否可以在不先解密文件,然后再进行另一次加密的情况下添加另一个收件人?
如果不解密就不可能根本但它似乎应该无需解密即可到文件:
gpg -d this_file.gpg | gpg -e -r "Some Name" -r "Another Name" -o this_file.gpg
但这似乎会导致文件损坏(至少有时),因为gpg
同时读取和写入同一个文件:
相反,您可以执行以下操作(在脚本中)以避免需要管理解密文件:
gpg -d -o this_file.txt this_file.gpg
gpg -e \
-r "Some Name" \
-r "Another Name" \
-o this_file.gpg \
--batch --yes \
this_file.txt
shred -u this_file.txt
shred
,使用-u
选项,可以安全地覆盖指定文件的数据,然后删除该文件。其他平台也有类似的程序,例如srm
Mac OS X。
或者你可以像这样编写脚本(由戴夫·汤普森)甚至避免将解密数据存储在文件中:
gpg -d this_file.gpg \
| gpg -e \
-r "Some Name" \
-r "Another Name" \
-o this_file.gpg.new \
--batch --yes
mv -f this_file.gpg.new this_file.gpg