Czy można dodać odbiorcę do już zaszyfrowanego pliku w GPG?

12

Zakładając, że zaszyfrowałem (prawdopodobnie duży) plik przy użyciu GPG; na przykład

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

Czy można dodać kolejnego odbiorcę bez uprzedniego odszyfrowania pliku, a następnie kolejnego szyfrowania?


źródło
Zaszyfrowałeś plik za pomocą klucza publicznego „Some Name”. A czego powinien użyć dla innego odbiorcy?
ott--
6
@ott: To nie do końca tak działa (AFAIK). PGP szyfruje plik kluczem symetrycznym, a nie kluczem publicznym odbiorców. Następnie osobno szyfruje kilka kopii tego klucza symetrycznego za pomocą klucza publicznego każdego odbiorcy.
RedGrittyBrick,
@RedGrittyBrick Nie wiem o pgp, ale używa --symmetricdo tego gpg . Dzięki --recipientniemu używa klucza publicznego odbiorcy. Może być więcej niż 1 adresat, ale należy to zrobić w jednym poleceniu, a nie w 2 osobnych poleceniach.
ott--
3
@ott: Przeczytałem, że „ Możliwe jest również szyfrowanie pliku jednocześnie dla dowolnej liczby wielu odbiorców za pomocą polecenia formularzagpg -e -r <name1> -r <name2> ... <file> ” Jednak sam tego nie próbowałem. Pasuje do tego, czego dowiedziałem się o kryptografii wiele lat temu, że prawie zawsze bardziej wydajne jest stosowanie szybkich algorytmów symetrycznych do szyfrowania tekstu wiadomości. Tylko klucz wiadomości jest szyfrowany przy użyciu powolnego szyfrowania asymetrycznego.
RedGrittyBrick

Odpowiedzi:

8

Krótka odpowiedź: nie

Przede wszystkim pamiętaj, że jeśli nie jesteś jednym z odbiorców, jest to całkowicie niemożliwe. Nie masz nawet możliwości odszyfrowania pliku, a tym bardziej dodania odbiorcy. Nawet jeśli zaszyfrowałeś go dwie sekundy temu.

Zakładając, że jesteś odbiorcą, jest to technicznie możliwe. Plik jest w rzeczywistości szyfrowany za pomocą klucza sesji, a klucz sesji jest szyfrowany za pomocą klucza publicznego, więc teoretycznie możesz odszyfrować klucz sesji i ponownie zaszyfrować go na klucz innej osoby, a następnie spakować wszystko razem w pliku tak, jakbyś pierwotnie zaszyfrował dokument obu osobom.

Jednak gpg nie ma takiej możliwości . Najbliższy możliwy do uzyskania z gpg to

  1. Użyj --show-session-keyopcji, aby uzyskać klucz sesji (który zdaje się również odszyfrować plik, w tym przypadku nie ma sensu)
  2. Zaszyfruj ten klucz sesji na cudzym kluczu publicznym (w rzeczywistości tworzy to nowy klucz sesji i używa tego klucza sesji do szyfrowania oryginalnego klucza sesji)
  3. Wyślij oba pliki.
  4. Odbiorca może odszyfrować klucz sesji i użyć go --override-session-keydo odszyfrowania oryginalnej wiadomości.
Nathan Grigg
źródło
3

1) W tej sytuacji szyfrowanie pliku do siebie (a także do zamierzonych odbiorców) jest zawsze dobrym pomysłem. RedGrittyBrick ma rację powyżej, opisując działanie GPG i PGP, co wpływa na powyższą odpowiedź nathanga.

2) Jeśli jednak masz oryginalny plik, najlepiej po prostu utworzyć nowy zaszyfrowany plik dla nowego odbiorcy.

Zakładając, że nie chcesz iść drogą klucza sesji z sugestii nathanga, jeśli zaszyfrowałeś plik do siebie (jak wyżej w punkcie 1), najpierw go odszyfruj, a następnie wykonaj krok 2 powyżej.

Jeśli nie masz oryginału ani nie zaszyfrowałeś go samemu, nie możesz odzyskać danych i nie możesz zaszyfrować ich przed nikim innym, bez wysłania kopii przez pierwszego odbiorcę.

mikebabcock
źródło
1
W rzeczywistości nie zawsze jest to dobry pomysł. Zobacz PGP: W tym swój klucz publiczny jako odbiorcę? Czy jesteś mniej bezpieczny? w sprawie wymiany stosu zabezpieczeń informacji dla niektórych argumentów za i przeciw.
CVn
0

Czy można dodać kolejnego odbiorcę bez uprzedniego odszyfrowania pliku, a następnie kolejnego szyfrowania?

To nie jest możliwe bez deszyfrowania w ogóle , ale to wydaje się, że powinna być możliwa bez odszyfrowywania do pliku :

gpg -d this_file.gpg | gpg -e -r "Some Name" -r "Another Name" -o this_file.gpg

Tyle że wydaje się, że powoduje to uszkodzenie pliku (przynajmniej czasami), ponieważ gpgjednocześnie odczytuje i zapisuje ten sam plik:

Zamiast tego możesz wykonać następujące czynności (w skrypcie), aby uniknąć konieczności zarządzania odszyfrowanym plikiem:

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, z -uopcją, bezpiecznie nadpisuje dane, a następnie usuwa określony plik. Podobne programy istnieją dla innych platform, takich jak srmMac OS X.

Możesz też napisać taki skrypt (dzięki uprzejmości dave_thompson_085 ), aby w ogóle uniknąć konieczności przechowywania odszyfrowanych danych w pliku:

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
Kenny Evitt
źródło
2
Nie musisz zapisywać czystego pliku tymczasowego, jeśli tymczasowo zostawisz zaszyfrowane miejsce: gpg -d file.gpg | gpg -e ... -o file.new; mv file.new file.gpglub jego kopię lustrzaną mv file.gpg file.old; gpg -d file.old | gpg -e ... -o file.gpg. Lub (być może też) sprytnie zachowaj starą i- węzeł :{ rm file.gpg; gpg -d /dev/fd/3; } 3<file.gpg | gpg -e ... -o file.gpg
dave_thompson_085
@ dave_thompson_085 Ciekawe - dzięki!
Kenny Evitt