是否可以将收件人添加到GPG中已经加密的文件中?


12

假设我已经使用GPG加密了(可能很大)文件;例如

gpg --recipient "Some Name" -o this_file.gpg --encrypt this_file.txt

是否可以在不先解密文件然后再加密的情况下添加另一个收件人?

gnupg 

您使用“某些名称”的公共密钥加密了文件。它将如何用于其他收件人?
ott-- 2012年

6
@ott:这不是它的工作原理(AFAIK)。PGP使用对称密钥而不是收件人公共密钥来加密文件。然后,使用每个接收者的公共密钥分别加密该对称密钥的多个副本。
RedGrittyBrick 2012年

@RedGrittyBrick我不了解pgp,但是gpg会用到--symmetric它。与--recipient它一起使用收件人的公共密钥。收件人可能超过1个,但必须用一个命令完成,而不要用2个单独的命令完成。
ott-- 2012年

3
@ott:我读到“ 也可以通过格式为命令的任意数量的多个收件人同时加密文件gpg -e -r <name1> -r <name2> ... <file> ”,尽管我自己没有尝试过。这与我多年前从加密中学到的知识相吻合,即使用快速对称算法加密消息文本几乎总是更有效。使用慢速非对称加密仅加密消息密钥。
RedGrittyBrick 2012年

Answers:


8

简短答案:否

首先,请注意,如果您不是收件人之一,则完全不可能。您甚至没有能力解密文件,更不用说添加收件人了。即使您在两秒钟前对其进行了加密。

假设您是收件人,从技术上讲是可能的。该文件实际上是使用会话密钥加密的,而会话密钥则是使用您的公共密钥加密的,因此理论上您可以解密该会话密钥并将其重新加密为其他人的密钥,然后将所有内容打包到一个文件中,就像您最初是将文件加密给两个人。

但是,gpg不具备此功能。使用gpg可以获得的最接近的是

  1. 使用该--show-session-key选项获取会话密钥(这似乎也可以解密文件,在这种情况下会丢失要点)
  2. 将该会话密钥加密为其他人的公共密钥(实际上,这将创建一个新的会话密钥,并使用该会话密钥来加密原始会话密钥)
  3. 发送两个文件。
  4. 收件人可以解密会话密钥,并可以--override-session-key用来解密原始消息。

3

1)这种情况就是为什么对自己(以及预期的收件人)加密文件总是一个好主意。RedGrittyBrick在描述GPG和PGP的工作原理时是正确的,而在上面的nathang答案中也是如此。

2)但是,如果您拥有原始文件,则最好仅向新收件人创建一个新的加密文件。

假设您不想按照nathang的建议进行会话密钥路由,如果首先将文件加密给自己(如上面#1中所述),则将其解密,然后执行上面的步骤#2。

如果您既没有原始文件也没有将其加密,那么如果没有第一个收件人向您发送副本,您将无法取回数据,也无法将其加密给其他任何人。


1
实际上,这并不总是一个好主意。请参阅PGP:是否包括您的公钥作为接收者?还有没有那么安全?在信息安全堆栈交换上可以找到一些赞成和反对的论据。
2014年

0

是否可以在不先解密文件然后再加密的情况下添加另一个收件人?

完全不解密就不可能了但是似乎不需要解密可以实现:

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上。

或者,您可以这样编写脚本(由dave_thompson_085提供),甚至完全不需要将解密后的数据存储在文件中:

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

2
如果您暂时将加密的文件(或它的镜像)留在原地,则无需写出一个清晰的临时文件 。或者(也许也是)巧妙地保留旧的inodegpg -d file.gpg | gpg -e ... -o file.new; mv file.new file.gpgmv file.gpg file.old; gpg -d file.old | gpg -e ... -o file.gpg{ rm file.gpg; gpg -d /dev/fd/3; } 3<file.gpg | gpg -e ... -o file.gpg
dave_thompson_085

@ dave_thompson_085有趣的–谢谢!
肯尼·埃维特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.