
假設我使用 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。
或者你可以像這樣編寫你的腳本(由戴夫湯普森_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