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?

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 alice@example.com \
    --recipient bob@example.com doc.txt

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


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 alice@example.com \
  --recipient bob@example.com \
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 .


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.


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ć.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.