Korzystanie z kryptografii klucza publicznego z wieloma odbiorcami
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
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
Nadawca generuje losową liczbę całkowitą $r \in [1,n-1]$ i nastaw $R = [r]G$
Pozwolić $P=(x(P),y(P)) = [r]P_i$ i upewnij się, że $P \neq \mathcal{O}$
Pozwolić $S = x(P)$
Uzyskaj klucz szyfrowania AES256$$k = \operatorname{HKDF}(S)$$
Szyfruj za pomocą AES-GCM lub ChaCha20Poly1305.
$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$
Wysłać $(R,c,IV,tag)$
Po stronie odszyfrowywania
- Oblicz $P = [x_i]R$ spowodowany $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ zgodnie z przygotowaniem
- Pozwolić $S = x(P)$
- Uzyskaj klucz szyfrowania AES256$$k = \operatorname{HKDF}(S)$$
- Odszyfruj $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$Nigdy nie akceptuj nieprawidłowego tagu, zatrzymaj się $(\perp)$?
WhatsApp stosuje podobny pomysł .
Uwaga: jeśli to możliwe, wybrałbym NaCL
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.
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.
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! :-))