Можно ли добавить получателя в уже зашифрованный файл в GPG?

12

Предполагая, что я зашифровал (возможно, большой) файл, используя GPG; например

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

Можно ли добавить другого получателя, не расшифровав файл, а затем еще одно шифрование?


источник
Вы зашифровали файл открытым ключом "Some Name". И что он будет использовать для другого получателя?
ot--
6
@ott: Это не совсем так, как это работает (AFAIK). PGP шифрует файл симметричным ключом, а не открытым ключом получателя. Затем он отдельно шифрует несколько копий этого симметричного ключа, используя открытый ключ каждого получателя.
RedGrittyBrick
@RedGrittyBrick Я не знаю о pgp, но --symmetricдля этого используется gpg . При --recipientэтом используется открытый ключ получателя. Может быть более одного получателя, но это нужно сделать одной командой, а не двумя отдельными командами.
ot--
3
@ott: Я читал, что « Также возможно зашифровать файл одновременно для любого количества нескольких получателей с помощью команды видаgpg -e -r <name1> -r <name2> ... <file> ». Я сам не пробовал этого. Это согласуется с тем, что я узнал о криптографии много лет назад: почти всегда более эффективно использовать быстрые симметричные алгоритмы для шифрования текста сообщения. Только ключ сообщения шифруется с использованием медленного асимметричного шифрования.
RedGrittyBrick

Ответы:

8

Краткий ответ: нет

Прежде всего, обратите внимание, что если вы не один из получателей, это совершенно невозможно. У вас даже нет возможности расшифровать файл, тем более добавить получателя. Даже если вы зашифровали его две секунды назад.

Предполагая, что вы являетесь получателем, это технически возможно. Файл фактически зашифрован с помощью ключа сеанса, а ключ сеанса зашифрован с помощью вашего открытого ключа, так что теоретически вы можете расшифровать ключ сеанса и повторно зашифровать его для ключа другого человека, а затем упаковать все вместе в файл, как если бы вы Первоначально зашифровал документ для обоих людей.

Однако у gpg такой возможности нет . Самое близкое, что вы можете получить с помощью gpg, это

  1. Используйте --show-session-keyопцию, чтобы получить ключ сеанса (который, кажется, также расшифровывает файл, пропуская точку в этом случае)
  2. Зашифруйте этот ключ сеанса к чужому открытому ключу (фактически, это создает новый ключ сеанса и использует этот ключ сеанса для шифрования исходного ключа сеанса)
  3. Отправьте оба файла.
  4. Получатель может расшифровать ключ сеанса и использовать его --override-session-keyдля расшифровки исходного сообщения.
Натан Григг
источник
3

1) В этой ситуации шифрование файла для себя (а также для предполагаемых получателей) всегда является хорошей идеей. RedGrittyBrick правильно описал выше, как работают GPG и PGP, что отражено в ответе Натанга выше.

2) Однако, если у вас есть оригинальный файл, лучше всего просто создать новый зашифрованный файл для нового получателя.

Предполагая, что вы не хотите идти по пути сессионного ключа по предложению Натанга, если вы сначала зашифровали файл для себя (как описано выше в # 1), затем расшифровали его и затем выполните шаг № 2 выше.

Если у вас нет оригинала и вы не зашифровали его для себя, вы не можете получить данные обратно и не можете зашифровать их кому-либо еще, если первый получатель не отправит вам обратно копию.

Бэбкок
источник
1
На самом деле, это не всегда хорошая идея. См. PGP: Включая ваш открытый ключ в качестве получателя? Какой-нибудь менее безопасный? на бирже стека информационной безопасности для некоторых аргументов за и против.
CVn
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
Вам не нужно записывать чистый временный файл, если вы временно оставляете зашифрованное на месте: gpg -d file.gpg | gpg -e ... -o file.new; mv file.new file.gpgили его зеркало mv 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 Интересно - спасибо!
Кенни Эвитт