szyfrowanie / deszyfrowanie za pomocą wielu kluczy

110

Czy można zaszyfrować dane, tak aby można je było odszyfrować kilkoma różnymi kluczami?

Przykład:

Zaszyfrowałem dane za pomocą klucza 1, ale chcę mieć możliwość odszyfrowania za pomocą kluczy 2, 3 i 4.

czy to możliwe?

Glen Solsberry
źródło

Odpowiedzi:

170

GnuPG standardowo wykonuje szyfrowanie z użyciem wielu kluczy.

Następujące polecenie zaszyfruje doc.txtprzy użyciu klucza publicznego Alicji i klucza publicznego Boba. Alicja może odszyfrować za pomocą swojego klucza prywatnego. Bob może również odszyfrować za pomocą swojego klucza prywatnego.

gpg --encrypt --recipient [email protected] \
    --recipient [email protected] doc.txt

Ta funkcja jest szczegółowo opisana w sekcji podręcznika użytkownika zatytułowanej „ Szyfrowanie i odszyfrowywanie dokumentów

David Segonds
źródło
Tak samo. Fajnie jest wiedzieć, jak to zrobić, ale nie mogę znaleźć na nim żadnej strony podręcznika.
MarkusQ
@Mitch, opublikowałem odpowiedź, która może zawierać naszą odpowiedź! (Proszę przetestuj i pochwal, jeśli tak / nie
BARDZO
@MarkusQ, zobacz mój link do Mitcha powyżej. Przetestuj / dziękuję, jeśli możesz! :-)
pythonlarry
W rezultacie powstaje 1 zaszyfrowany plik, który można odczytać przy użyciu dowolnego klucza prywatnego, a nie 1 pliku na klucz?
user8675309
7
@ user8675309, tak. Dane są szyfrowane wspólnym kluczem symetrycznym. Tylko klucz symetryczny jest szyfrowany kluczem publicznym każdego odbiorcy. Nie jest to ponowne szyfrowanie całych danych dla każdego odbiorcy.
wisbucky
55

tak, to możliwe

Tak, możliwe jest szyfrowanie dla wielu odbiorców. Wydaje się również logiczne, gdy myślisz, że możesz chcieć przeczytać to, co do kogoś wysłałeś, i aby to zrobić , musisz znajdować się na liście odbiorców.

Wiersz poleceń

Oto jak to zrobić za pomocą gpgwiersza poleceń (jak opisano w odpowiedzi Davida Segondsa ):

gpg --encrypt \
  --recipient [email protected] \
  --recipient [email protected] \
clear-message.txt

Klient GUI

Twój GUI musi umożliwiać szyfrowanie dla kilku osób

Mechanizm

Jest pytanie dotyczące bezpieczeństwa informacji , rozmiaru pliku GPG dla wielu odbiorców? , które wyjaśniają mechanizm szyfrowania :

GPG szyfruje plik raz za pomocą klucza symetrycznego, a następnie umieszcza nagłówek identyfikujący docelową parę kluczy i zaszyfrowaną wersję klucza symetrycznego.

[...] W przypadku zaszyfrowania do wielu odbiorców nagłówek ten jest umieszczany wielokrotnie, zapewniając unikalnie zaszyfrowaną wersję tego samego klucza symetrycznego dla każdego odbiorcy .

Édouard Lopez
źródło
4
specjalne podziękowania za ostatnie dwa zdania: teraz wszystko stało się jasne!
radistao
31

Klienci GnuPG i PGP zazwyczaj szyfrują rzeczywiste dane kluczem symetrycznym zwanym „kluczem sesji”. Klucz sesji jest następnie szyfrowany za pomocą każdego „klucza odbiorcy” (tj. Tych, które określisz opcją -r / - adresat). Jest to czasami nazywane szyfrem hybrydowym . W tej chwili uważam, że GnuPG domyślnie używa 256-bitowych kluczy sesji i AES do szyfrowania danych w postaci zwykłego tekstu do tego klucza sesji AES-256, a klucze odbiorców to RSA / DSA / ECDSA / itd. klucz asymetryczny w tym przypadku.

Jednym z powodów robienia tego w ten sposób jest to, że symetryczne algorytmy kryptograficzne, takie jak AES, są generalnie znacznie szybsze niż asymetryczne, takie jak RSA. GnuPG musi więc zaszyfrować tylko ~ 256 bitów (klucz sesji) za pomocą RSA i może używać AES do szyfrowania danych (tak dużych, jak chcesz!) Za pomocą tego klucza sesji. Maszyny Intela mają nawet wbudowaną instrukcję AES-NI , aby wykonać pewne kroki algorytmu sprzętowego, co sprawia, że ​​GnuPG jest wyjątkowo szybki w szyfrowaniu / odszyfrowywaniu danych.

Innym powodem zrobienia tego w ten sposób jest to, że umożliwia szyfrowanie dokumentów zaszyfrowanych przez PGP dla wielu stron bez konieczności podwajania rozmiaru dokumentu. Zauważ, że jeśli określisz wielu odbiorców dla zaszyfrowanego dokumentu (np. gpg -ea -r Alice -r Bob -o ciphertext.asc), Zaszyfrowany dokument, który zostanie zapisany (ciphertext.asc) nie jest 2x tak duży, jak gdybyś go właśnie zaszyfrował dla Alicji.

Zobacz także --show-session-keyparametr na stronie podręcznika gpg, aby móc odszyfrować tylko klucz sesji, na przykład, aby umożliwić osobie trzeciej odszyfrowanie zaszyfrowanego dokumentu bez konieczności przesyłania do niej klucza prywatnego lub danych w postaci zwykłego tekstu.

ja robię
źródło
1
Dziękuję za wyjaśnienie, że zaszyfrowany dokument nie jest n-krotnie większy, gdzie n to liczba sygnatariuszy.
theartofbeing
4

Tak, to możliwe. Na początek „szyfrowanie wielostronne” Google.

AFAIK, nie ma ich jednak wrzucać i używać do tego pakietów em.

- MarkusQ

PS Zastanów się, jak można to zrobić. Zaszyfrowana wiadomość składa się z:

  • ładunek zaszyfrowany jednorazową podkładką
  • jednorazowa klawiatura, zaszyfrowana za pomocą klucza 1
  • jednorazowa klawiatura, zaszyfrowana kluczem 2
  • ...
  • tabliczka jednorazowa, zaszyfrowana kluczem N

Odbiorca, który posiada klucz i, po prostu odszyfrowuje swoją kopię pada swoim kluczem, a następnie odszyfrowuje ładunek.

Jednak jest to tylko dowód, że można to zrobić i będzie ssać jak rzeczywistej realizacji. Jeśli to możliwe, należy unikać zmiany własnego szyfrowania. Jeśli nie rozumiesz dlaczego, zdecydowanie powinieneś unikać zmiany własnego szyfrowania.

-----Edytować ------------

Jeśli się mylę i narzędzia Gnu to robią, użyj ich. Ale nie mogę znaleźć żadnych informacji, jak to zrobić.

MarkusQ
źródło
1
To, co może być do niczego, to fakt, że gdy już znasz jednorazową tablicę czasową, masz znany zwykły tekst wraz z zaszyfrowanymi wartościami innych kluczy. Korzystając z tych informacji, możesz łatwiej dowiedzieć się, jakie są inne klucze.
Kibbee
2
Wyszukiwanie w Google „szyfrowania wielu stron” nie pojawia się zbyt często. Prawdopodobnie będziesz miał więcej szczęścia z „szyfrowaniem transmisji”, które obejmuje również ten przypadek.
staktrace
1
@Kibbee: Klucze nie są tajne, są publiczne. Nie ma więc znaczenia, czy łatwiej jest je odkryć. (Te schematy są używane tylko z kluczami, które mogą być używane tylko do szyfrowania, a nie deszyfrowania.)
David Schwartz
5
Jestem prawie pewien, że rzeczywiste implementacje nie używają współdzielonej jednorazowej podkładki (która musiałaby być tak duża jak zwykły tekst i zaszyfrowany tekst, podwajając w ten sposób rozmiar wiadomości), ale w rzeczywistości używają współdzielonego symetrycznego klucza szyfrowania (który jest zwykle znacznie mniejszy niż wiadomość).
Joachim Sauer
-16

Wielokrotny (więcej niż dwa) klucz RSA może wyglądać tak - cóż, nie jestem matematykiem, więc ten algorytm niekoniecznie jest bezpieczny, po prostu chcę dać mu pomysł.

m = p * q * r; p, q, r to duże liczby pierwsze

fi (m) = (p-1) (q-1) (r-1)

d == (e1 * e2 * e3 * ... * ei) ^ (- 1) (mod fi (m)); e1 ... ei są liczbami arbitralnymi, d oblicza się, aby spełnić równanie

y1 == x ^ e1 (mod m)

y2 == y1 ^ e2 (mod m)

y3 == y2 ^ e3 (mod m)

...

x == yi ^ d (mod m)

Algorytm ten można wykorzystać na przykład do zwiększenia szybkości routera cebulowego.

IQfighter
źródło