Korzystanie z kryptografii klucza publicznego z wieloma odbiorcami

Nov 26 2020

Mam wiadomość, którą chcę wysłać do wielu odbiorców.

Czy mogę zaszyfrować wiadomość osobno każdym z kluczy publicznych odbiorcy, a następnie wysłać tak zaszyfrowaną wiadomość do odpowiedniego odbiorcy?

Jeśli atakujący uzyska wszystkie zaszyfrowane wiadomości i wie, że wszystkie mają tę samą zawartość, ale są zaszyfrowane różnymi kluczami, czy ułatwiłoby to atak?

Co powiesz na to, że jeśli atakujący zdoła odszyfrować jedną z wiadomości lub uzyska zwykły tekst w inny sposób, czy złamałoby to którykolwiek z pozostałych kluczy prywatnych?

Czy istnieje forma szyfrowania asymetrycznego, która działałaby lepiej niż inne w tym scenariuszu?

Odpowiedzi

10 kelalaka Nov 26 2020 at 14:30

Nie określono szczegółów metody analizy, jednak zwykła metoda nie opiera się wyłącznie na szyfrowaniu za pomocą kryptografii klucza publicznego, a raczej na kryptosystemie hybrydowym , w którym klucz symetryczny jest przesyłany za pomocą kryptografii klucza publicznego, a klucz jest używany w kryptografii klucza symetrycznego.

Dzięki RSA

Powiedzmy, że chcemy wysłać wiadomość $m$ do $n$ Strony mają $pub_i$ i $prv_i$ klucze (użyj RSA z OAEP).

Teraz wygeneruj jednolity losowy klucz AES256 $k$ i zaszyfruj wiadomość za pomocą AES-GCM,

$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

Teraz zaszyfruj plik $k$ dla każdej osoby $$\bar k = \operatorname{RSA-OAEP-Enc}(pub_i,k)$$ i wyślij każdego użytkownika $(\bar k, c, IV, tag)$. Teraz każdy użytkownik może indywidualnie otrzymać klucz$k$ i odszyfruj wiadomość.

Słabość polega na tym, że obserwator może zobaczyć, że wysłałeś tę samą wiadomość do wszystkich. Aby to złagodzić, w razie potrzeby użyj różnych IV dla każdego użytkownika. Pamiętaj, że wydłuży to czas szyfrowania.

Inni kandydaci

RSA-KEM

Powyższe dotyczyło bezpośredniego wykorzystania RSA. Zwykle można wybrać RSA-KEM (w skrócie poniżej, pełne szczegóły tutaj )

  • Wygeneruj losowo $r \in [1,n-1]$ i użyj HKDF do wyprowadzenia klucza.
  • Zaszyfruj wiadomość za pomocą AES-GCM przy użyciu klucza pochodnego
  • wysłać $r$ z podręcznikiem-RSA wraz z $(c,tag)$

NaCL

NaCl ma do tego istniejące rozwiązania; uwierzytelnione szyfrowanie

Schemat zintegrowanego szyfrowania (IES)

Integrated Encryption Scheme (IES) ma również wersję multiplikatywną i krzywą eliptyczną.

W wersji ECIES z krzywą eliptyczną po pierwsze, są włączone umowy

  • parametry krzywej eliptycznej $(q,n,b,G,n,h)$
  • Kluczowa funkcja pochodna (KDF)
  • Kod uwierzytelniający wiadomość, taki jak HMAC-SHA256 (lub bezpośrednio użyj AES-GCM lub ChaCha20-Poly1305)
  • każdy użytkownik ma $x_i$ jako klucz prywatny i klucz publiczny $P_i = [x_i]G$

Następnie wiadomość może zostać wysłana jako

  1. Nadawca generuje losową liczbę całkowitą $r \in [1,n-1]$ i nastaw $R = [r]G$

  2. Pozwolić $P=(x(P),y(P)) = [r]P_i$ i upewnij się, że $P \neq \mathcal{O}$

  3. Pozwolić $S = x(P)$

  4. Uzyskaj klucz szyfrowania AES256$$k = \operatorname{HKDF}(S)$$

  5. Szyfruj za pomocą AES-GCM lub ChaCha20Poly1305.

    $$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$

  6. Wysłać $(R,c,IV,tag)$

Po stronie odszyfrowywania

  1. Oblicz $P = [x_i]R$ spowodowany $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ zgodnie z przygotowaniem
  2. Pozwolić $S = x(P)$
  3. Uzyskaj klucz szyfrowania AES256$$k = \operatorname{HKDF}(S)$$
  4. Odszyfruj $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$Nigdy nie akceptuj nieprawidłowego tagu, zatrzymaj się $(\perp)$?

WhatsApp

WhatsApp stosuje podobny pomysł .


Uwaga: jeśli to możliwe, wybrałbym NaCL

3 user10216038 Nov 26 2020 at 16:30

Czy istnieje forma szyfrowania asymetrycznego, która działałaby lepiej niż inne w tym scenariuszu?

Zwykły stary GPG już obsługuje tę możliwość.

Możesz dodać dowolną liczbę parametrów nazwy odbiorcy - - . Działa podobnie do metody opisanej przez kelalakę, tylko że jest już wbudowana w GPG.

2 Ángel Nov 27 2020 at 01:54

Mam wiadomość, którą chcę wysłać do wielu odbiorców.

W porządku

Czy mogę zaszyfrować wiadomość osobno każdym z kluczy publicznych odbiorcy,

Właściwie, kiedy mówimy o szyfrowaniu wiadomości za pomocą klucza publicznego, jest to uproszczenie i używamy kryptografii mieszanej. Wiadomość jest szyfrowana przy użyciu algorytmu symetrycznego (np. AES) z losowym kluczem, a następnie ten klucz jest ściśle zaszyfrowany kluczem publicznym.

następnie wysłać zaszyfrowaną w ten sposób wiadomość do odpowiedniego odbiorcy?

Tak. Zwróć uwagę, że możesz zaszyfrować do wszystkich odbiorców przy użyciu tego samego losowego klucza (umożliwia to wysłanie każdemu jednej kopii pliku) lub w pełni ponownie zaszyfrowanego pliku do każdego.

Jeśli atakujący uzyska wszystkie zaszyfrowane wiadomości i wie, że wszystkie mają tę samą zawartość, ale są zaszyfrowane różnymi kluczami, czy ułatwiłoby to atak?

Nie (zakładając oczywiście odpowiednie algorytmy)

Co powiesz na to, że jeśli atakujący zdoła odszyfrować jedną z wiadomości lub uzyska zwykły tekst w inny sposób, czy złamałoby to którykolwiek z pozostałych kluczy prywatnych?

I nie. Celem kryptografii klucza publicznego / prywatnego jest dokładnie to , że znajomość klucza publicznego nie narusza klucza prywatnego. Zwróć uwagę, że atakujący może tworzyć własne zaszyfrowane wiadomości do wszystkich tych osób, a więc nieskończone wiadomości, których tekst zwykły zna.

Czy istnieje forma szyfrowania asymetrycznego, która działałaby lepiej niż inne w tym scenariuszu?

Nie całkiem. W rzeczywistości chcesz szyfrowania hybrydowego, ale dokładny algorytm nie ma znaczenia, pod warunkiem, że jest dobry. Poleciłbym korzystanie z kryptografii eliptycznej, ponieważ wymaga to krótszych kluczy i wiadomości, ale poza tym, że jest większy, RSA również jest w porządku.

2 RogerLucas Nov 27 2020 at 22:18

CMS (Cryptographic Message Syntax) obsługuje to w standardzie. Twoje dane są szyfrowane losowym kluczem symetrycznym, a następnie ten klucz jest szyfrowany raz dla każdego z kluczy publicznych odbiorców, do których chcesz wysłać wiadomość.

Implementuje to narzędzie OpenSSL. Potrzebujesz certyfikatu dla każdego odbiorcy, do którego chcesz, aby wiadomość mogła zostać odebrana.

Jeśli masz plik source.bin, który chcesz bezpiecznie wysłać do trzech odbiorców, możesz zrobić:

openssl cms -encrypt -in source.bin -out encrypted.cms -recip friend1.cert -recip friend2.cert -recip friend3.cert 

Ty je wysyłasz encrypted.cms.

Twój „Przyjaciel 1” może wtedy:

openssl cms -decrypt -in encrypted.cms -recip friend1.cert -inkey friend1-private.pem -out source.bin

„Przyjaciel 2” i „Przyjaciel 3” mogą zrobić to samo ze swoimi kluczami, a także uzyskać oryginalne dane.

Jeśli chcesz, możesz również podpisać dane, aby uwierzytelnić je jako pochodzące od Ciebie.

Widzieć: https://www.openssl.org/docs/man1.1.1/man1/cms.html

W Internecie jest wiele przykładów i wskazówek dotyczących OpenSSL i CMS (niektóre nawet na Stack Exchange / Overflow! :-))