Verwendung der Kryptografie mit öffentlichem Schlüssel mit mehreren Empfängern
Ich habe eine Nachricht, die ich an mehrere Empfänger senden möchte.
Kann ich die Nachricht separat mit jedem öffentlichen Schlüssel des Empfängers verschlüsseln und die so verschlüsselte Nachricht dann an den jeweiligen Empfänger senden?
Wenn ein Angreifer alle verschlüsselten Nachrichten erhält und weiß, dass alle denselben Inhalt haben, aber mit unterschiedlichen Schlüsseln verschlüsselt sind, würde dies den Angriff erleichtern?
Wie wäre es, wenn der Angreifer es schafft, eine der Nachrichten zu entschlüsseln oder den Klartext auf andere Weise zu erhalten, würde dies einen der anderen privaten Schlüssel gefährden?
Gibt es eine Form der asymmetrischen Verschlüsselung, die in diesem Szenario besser funktioniert als andere?
Antworten
Sie haben die Details Ihrer zu analysierenden Methode nicht angegeben. Die übliche Methode basiert jedoch nicht nur auf der Verschlüsselung mit Kryptografie mit öffentlichem Schlüssel, sondern auf einem hybriden Kryptosystem , bei dem der symmetrische Schlüssel mit der Kryptografie mit öffentlichem Schlüssel übertragen wird und der Schlüssel ist wird in der Kryptographie mit symmetrischen Schlüsseln verwendet.
Mit RSA
Angenommen, wir möchten die Nachricht senden $m$ zu $n$ Parteien haben jeweils $pub_i$ und $prv_i$ Schlüssel (verwenden Sie RSA mit OAEP).
Generieren Sie nun einen einheitlichen zufälligen AES256-Schlüssel $k$ und verschlüsseln Sie die Nachricht mit AES-GCM,
$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$
Verschlüsseln Sie nun die $k$ für jede Person $$\bar k = \operatorname{RSA-OAEP-Enc}(pub_i,k)$$ und senden Sie jeden Benutzer $(\bar k, c, IV, tag)$. Jetzt kann jeder Benutzer den Schlüssel einzeln erhalten$k$ und entschlüsseln Sie die Nachricht.
Die Schwäche ist, dass ein Beobachter sehen kann, dass Sie allen dieselbe Nachricht gesendet haben. Verwenden Sie gegebenenfalls unterschiedliche IVs pro Benutzer, um dies zu verringern. Beachten Sie, dass dies die Verschlüsselungszeit verlängert.
Andere Kandidaten
RSA-KEM
Das Obige war die direkte Verwendung des RSA. Normalerweise kann man sich für RSA-KEM entscheiden (kurz unten, hier alle Details )
- Generiere einen Zufall $r \in [1,n-1]$ und verwenden Sie HKDF, um einen Schlüssel abzuleiten.
- Verschlüsseln Sie die Nachricht mit AES-GCM mithilfe des abgeleiteten Schlüssels
- Sende das $r$ mit Lehrbuch-RSA zusammen mit dem $(c,tag)$
NaCL
NaCl hat dafür bereits Lösungen; die authentifizierte Verschlüsselung
Integriertes Verschlüsselungsschema (IES)
Das integrierte Verschlüsselungsschema (IES) verfügt über eine multiplikative und eine elliptische Kurvenversion.
In der elliptischen Kurvenversion ECIES gibt es zunächst Vereinbarungen über
- die elliptischen Kurvenparameter $(q,n,b,G,n,h)$
- Schlüsselableitungsfunktion (KDF)
- Nachrichtenauthentifizierungscode wie HMAC-SHA256 (oder verwenden Sie direkt AES-GCM oder ChaCha20-Poly1305)
- Jeder Benutzer hat $x_i$ als privater Schlüssel und als öffentlicher Schlüssel $P_i = [x_i]G$
Dann kann die Nachricht als gesendet werden
Der Absender generiert eine zufällige Ganzzahl $r \in [1,n-1]$ und setzen $R = [r]G$
Lassen $P=(x(P),y(P)) = [r]P_i$ und stellen Sie sicher, dass $P \neq \mathcal{O}$
Lassen $S = x(P)$
Leiten Sie den Verschlüsselungsschlüssel AES256 ab$$k = \operatorname{HKDF}(S)$$
Mit AES-GCM oder ChaCha20Poly1305 verschlüsseln.
$$(c,tag) = \operatorname{AES-GCM-Enc}(k,IV,m)$$
Senden $(R,c,IV,tag)$
Auf der Entschlüsselungsseite
- Berechnung $P = [x_i]R$ durch $$P = [x_i]R=[x_i r]G =[r x_i] G = [r]P_i $$ wie vorbereitet
- Lassen $S = x(P)$
- Leiten Sie den Verschlüsselungsschlüssel AES256 ab$$k = \operatorname{HKDF}(S)$$
- Entschlüsseln $$(m,\perp) = \operatorname{AES-GCM-Dec}(k,IV,c,tag)$$Akzeptiere niemals ein falsches Tag, halte an $(\perp)$?
WhatsApp verwendet eine ähnliche Idee .
Hinweis: Wenn möglich, würde ich mich für die NaCL entscheiden
Gibt es eine Form der asymmetrischen Verschlüsselung, die in diesem Szenario besser funktioniert als andere?
Normales altes GPG unterstützt diese Funktion bereits.
Sie können beliebig viele Parameter für den Empfängernamen hinzufügen . Es funktioniert ähnlich wie die von Kelalaka beschriebene Methode, nur dass es bereits in GPG integriert ist.
Ich habe eine Nachricht, die ich an mehrere Empfänger senden möchte.
Fein
Kann ich die Nachricht separat mit jedem öffentlichen Schlüssel des Empfängers verschlüsseln?
Wenn wir über das Verschlüsseln einer Nachricht mit ihrem öffentlichen Schlüssel sprechen, ist dies eine Vereinfachung, und wir verwenden gemischte Kryptografie. Die Nachricht wird unter Verwendung eines symmetrischen Algorithmus (wie AES) mit einem zufälligen Schlüssel verschlüsselt , und dieser Schlüssel ist derjenige, der streng mit dem öffentlichen Schlüssel verschlüsselt ist.
dann die so verschlüsselte nachricht an den jeweiligen empfänger senden?
Ja. Beachten Sie, dass Sie mit demselben Zufallsschlüssel an alle Empfänger verschlüsseln können (dies ermöglicht es Ihnen, eine einzelne Kopie der Datei an alle zu senden) oder an jeden Empfänger eine vollständig neu verschlüsselte Datei.
Wenn ein Angreifer alle verschlüsselten Nachrichten erhält und weiß, dass alle denselben Inhalt haben, aber mit unterschiedlichen Schlüsseln verschlüsselt sind, würde dies den Angriff erleichtern?
Nein (offensichtlich unter der Annahme geeigneter Algorithmen)
Wie wäre es, wenn der Angreifer es schafft, eine der Nachrichten zu entschlüsseln oder den Klartext auf andere Weise zu erhalten, würde dies einen der anderen privaten Schlüssel gefährden?
Und nein. Der Punkt der Krypto mit öffentlichen / privaten Schlüsseln ist genau, dass die Kenntnis des öffentlichen Schlüssels den privaten nicht gefährdet. Beachten Sie, dass der Angreifer möglicherweise selbst verschlüsselte Nachrichten an alle diese Personen selbst erstellt, also unendlich viele Nachrichten, deren Klartext es weiß.
Gibt es eine Form der asymmetrischen Verschlüsselung, die in diesem Szenario besser funktioniert als andere?
Nicht wirklich. Sie möchten eigentlich eine Hybridverschlüsselung, aber der genaue Algorithmus spielt keine Rolle, vorausgesetzt, er ist gut. Ich würde die Verwendung der elliptischen Kryptographie empfehlen, da dies kürzere Schlüssel und Nachrichten erfordert, aber RSA ist nicht nur größer, sondern auch in Ordnung.
CMS (Cryptographic Message Syntax) unterstützt dies standardmäßig. Ihre Daten werden mit einem zufälligen symmetrischen Schlüssel verschlüsselt, und dieser Schlüssel wird dann für jeden der öffentlichen Schlüssel der Empfänger, an die Sie die Nachricht senden möchten, einmal verschlüsselt.
Das OpenSSL-Dienstprogramm implementiert dies. Sie benötigen für jeden Empfänger ein Zertifikat, von dem die Nachricht empfangen werden soll.
Wenn Sie eine Datei haben source.bin
, die Sie sicher an drei Empfänger senden möchten, haben Sie folgende Möglichkeiten:
openssl cms -encrypt -in source.bin -out encrypted.cms -recip friend1.cert -recip friend2.cert -recip friend3.cert
Du schickst sie encrypted.cms
.
Ihr "Freund 1" kann dann:
openssl cms -decrypt -in encrypted.cms -recip friend1.cert -inkey friend1-private.pem -out source.bin
"Freund 2" und "Freund 3" können dasselbe mit ihren Schlüsseln tun und auch die Originaldaten erhalten.
Wenn Sie möchten, können Sie die Daten auch signieren, um sie als von Ihnen stammend zu authentifizieren.
Sehen: https://www.openssl.org/docs/man1.1.1/man1/cms.html
Es gibt viele Beispiele und Anleitungen für OpenSSL und CMS im Internet (einige sogar bei Stack Exchange / Overflow! :-))