2008-09-02 14 views
8

Was sind die Grundlagen für die Datenverschlüsselung mit genau zwei Schlüsseln (die passwortbasiert sein könnten), die aber nur einen (einen) der beiden Schlüssel benötigen, um die Daten zu entschlüsseln?Wie verschlüsselt man eine Nachricht für mehrere Empfänger?

Zum Beispiel werden Daten mit einem Benutzerpasswort und dem Firmenpasswort verschlüsselt, und dann kann er oder seine Firma die Daten entschlüsseln. Keiner von ihnen kennt das andere Passwort. Nur eine Kopie der verschlüsselten Daten wird gespeichert.

Ich meine nicht öffentlichen/privaten Schlüssel. Wahrscheinlich über symmetrische Schlüssel-Kryptographie und vielleicht beinhaltet es etwas wie XORing die Schlüssel zusammen, um sie für die Verschlüsselung zu verwenden.

Update: Ich möchte auch eine Lösung finden, die nicht die Speicherung der Schlüssel überhaupt beinhaltet.

+0

Siehe auch: https://superuser.com/q/554513/199930 –

Antwort

18

Die übliche Vorgehensweise besteht darin, einen einzelnen symmetrischen Schlüssel zum Verschlüsseln der Daten zu generieren. Dann verschlüsseln Sie den symmetrischen Schlüssel mit dem Schlüssel oder Passwort jedes Empfängers, sodass sie diesen selbst entschlüsseln können. S/MIME (eigentlich die Cryptographic Message Syntax, auf der S/MIME basiert) verwendet diese Technik.

Auf diese Weise müssen Sie nur eine Kopie der verschlüsselten Nachricht, aber mehrere Kopien des Schlüssels speichern.

+0

Gibt es irgendwelche Sicherheitsprobleme mit dieser Methode? Wenn ich mehrere Dateien (jede Datei mit einem anderen symmetrischen Schlüssel) an dieselbe Liste von Empfängern sende (nenne sie A und B). Kann Person A den symmetrischen Schlüssel (Quelltext) und das verschlüsselte Formular für Person B betrachten und den Schlüssel von Person B bestimmen, wenn genügend Nachrichten gesendet werden? –

+1

Asa, es hängt von dem Algorithmus ab, der zum Verschlüsseln des Inhalts- (Nachrichten-) Verschlüsselungsschlüssels verwendet wird. Einige Algorithmen könnten anfällig sein. Ich verwende normalerweise RSA, um den Inhaltsverschlüsselungsschlüssel zu verschlüsseln, und dort kann der richtige Auffüllmodus gegen Klartextangriffe schützen. Ich verwende OAEP wann immer möglich. – erickson

+0

erickson, Sie hätten also den Schlüssel A, der zum Verschlüsseln der Nachricht verwendet wurde, dann senden Sie dem Benutzer 1 eine Kopie von A mit dem Pub-Schlüssel von 1 verschlüsselt, dem Benutzer 2 eine Kopie von A, die mit dem Pubschlüssel von 2 verschlüsselt ist? – user8675309

6

Allgemein gesagt, was Sie tun, ist die Daten mit einem zufällig generierten Schlüssel zu verschlüsseln, und dann Versionen dieses zufälligen Schlüssels anhängen, die mit jedem bekannten Schlüssel verschlüsselt wurden. So kann jeder mit einem gültigen Schlüssel den "echten" Schlüssel finden, der zum Verschlüsseln der Daten verwendet wurde.

0

Ich denke ich an einer Lösung gedacht, die funktionieren würden:

D = data to encrypt 
h1 = hash(userpassword) 
h2 = hash(companyPassword) 
k = h1 concat h2 

E = function to encrypt 
//C is the encrypted data 
C = E_h1(h2) concat E_h2(h1) concat E_k(D) 

Dann entweder Person des Hash-Wert der anderen Person entschlüsseln kann, und dann verbinden Sie den Rest der Daten zu entschlüsseln.

Vielleicht gibt es eine bessere Lösung als diese?

+0

Diese Lösung funktioniert, obwohl es unhandlich wird, wenn mehr als 2 Schlüssel vorhanden sind. –

0

Im allgemeineren Fall kann ein Geheimnis (in dieser Anwendung ein Entschlüsselungsschlüssel für die Daten) in Anteile aufgeteilt werden, so dass eine bestimmte Anzahl dieser Anteile benötigt wird, um das Geheimnis wiederherzustellen. Dies ist bekannt als geheime Freigabe oder mit n Teilen und einem Schwellenwert von t, einem (t, n) -Schwellenschema.

Man kann dies tun, indem man ein Polynom der Ordnung t-1 erstellt, das Geheimnis als ersten Koeffizienten einstellt und den Rest der Koeffizienten zufällig wählt. Dann werden n zufällige Punkte auf dieser Kurve ausgewählt und die Anteile werden.

+0

Für seinen Anwendungsfall wäre das geheime Teilen degeneriert, als t = 1, und die "Kurve" wäre die horizontale Linie, die das Geheimnis durchläuft. Beachten Sie auch, dass es nicht wichtig ist, die Verteilungspunkte zufällig auszuwählen. In der Praxis werden die Aktien oft nacheinander ausgegeben: 1, 2, 3 ... – erickson

1

Wenn ich Sie richtig verstanden habe, haben Sie einige Daten, die Sie bereit sind, den Verschlüsselungsschlüssel in n ‚Schlüssel Stück‘ gespaltet zu verschlüsseln und zu verteilen. (In Ihrem Fall 2 Stück)

Dafür könnten Sie die verwenden XOR-basierte Aufteilung, hier ist, wie es funktioniert: Sie stellen die erforderliche Anzahl von Teilen - n, und den geheimen Schlüssel - K. Um n Teile Ihres Schlüssels zu generieren, müssen Sie (n - 1) Zufallszahlen erstellen: R1, R2, R3,. . . , Rn-1. Dazu können Sie einen SecureRandom Nummerngenerator verwenden, der uns vor Duplikaten schützt. Dann bedienen Sie die XOR Funktion auf diesen Rn-1 Stücken und Ihren Schlüssel - K:
Rn = R1 ⊕ R2 ⊕ R3 ⊕. . . Now Rn-1 ⊕ K

Jetzt haben Sie Ihre n Stücke: R1, R2, R3, ..., Rn-1, Rn und Sie können die K zerstören. Diese Stücke können in Ihrem Code verteilt oder an die Benutzer gesendet werden.

Um den Schlüssel wieder zusammenzusetzen, verwenden wir XOR-Operation auf unseren Rn Stücken:
K = R1 ⊕ R2 ⊕ R3 ⊕. . . With Rn-1 ⊕ Rn

Mit der XOR-Funktion (⊕) ist jedes Teil von grundlegender Bedeutung für die Rekonstruktion des Schlüssels. Wenn Bits in einem der Teile geändert werden, kann der Schlüssel nicht wiederhergestellt werden.

Für mehr Informationen und Code können Sie einen Blick auf die Android-Dienstprogramm nehme ich zu diesem Zweck schrieb:
GitHub Projekt: https://github.com/aivarsda/Secret-Key-Split-Util

Auch können Sie die Secret Key Splitter Demo-Anwendung versuchen, die das Dienstprogramm verwendet: Google Play: https://play.google.com/store/apps/details?id=com.aivarsda.keysplitter