it-swarm-eu.dev

Kann ich einen privaten Schlüssel als öffentlichen Schlüssel verwenden und umgekehrt?

Ich habe Code zum Verschlüsseln von Daten mit einem öffentlichen Schlüssel und zum Entschlüsseln mit einem privaten Schlüssel. Dies ist nützlich, wenn ein Client Daten an einen Server senden möchte und weiß, dass nur der Server sie entschlüsseln kann.

Angenommen, ich möchte, dass der Server Daten mit dem Schlüssel privat verschlüsselt und mit dem Schlüssel öffentlich entschlüsselt, um Daten zu verteilen, deren Überprüfung überprüft werden kann richtiger Server. Kann ich den privaten Schlüssel einfach veröffentlichen und den öffentlichen Schlüssel geheim halten, anstatt den Code zu ändern, um dies zu ermöglichen? Beeinträchtigt dies die Sicherheit des Systems?

39
Graeme Perrow

Angenommen, der Server soll Daten mit dem privaten Schlüssel verschlüsseln und mit dem öffentlichen Schlüssel entschlüsseln, um Daten zu verteilen, von denen überprüft werden kann, dass sie vom richtigen Server stammen.

Sie können dies tun - auf eine sehr vereinfachte Ebene funktioniert die RSA-Signatur (Anmerkung, vereinfacht - es steckt noch ein bisschen mehr dahinter).

Kann ich den privaten Schlüssel einfach veröffentlichen und den öffentlichen Schlüssel geheim halten, anstatt den Code zu ändern, um dies zu ermöglichen? Beeinträchtigt dies die Sicherheit des Systems?

Sie müssen den privaten Schlüssel überhaupt nicht veröffentlichen - RSA ist eine Trapdoor-Permutation, was bedeutet:

  • Wenn Sie mit einem öffentlichen Schlüssel verschlüsseln, können Sie mit dem privaten Schlüssel entschlüsseln.
  • Wenn Sie mit einem privaten Schlüssel verschlüsseln, können Sie mit einem öffentlichen Schlüssel entschlüsseln.

Daher unterstützt RSA sowohl das Signieren als auch das Verschlüsseln, wobei der Endbenutzer nur über den öffentlichen Schlüssel verfügt.

Wenn der Client in Ihrem Fall überprüfen möchte, ob Daten vom Server stammen, wenden Sie den zweiten Fall von RSA an und entschlüsseln die Signaturdaten mit dem bereits vorhandenen öffentlichen Schlüssel.

Da es sich um eine Permutation handelt, sollten Sie Ihren Code außerdem überhaupt nicht ändern müssen. Beide Tasten sollten mit derselben Funktion arbeiten. Ich würde erwarten, dass jede anständige Kryptobibliothek APIs zur Überprüfung von Signaturen gemäß den unterschiedlichen Standards hat - eine davon wäre wahrscheinlich eine gute Wahl.

RSA Labs bieten ein Nice Erklärung hierfür .

Wenn Sie dies zwischen Servern erweitern oder die Clientkommunikation überprüfen möchten, generieren Sie Schlüssel für jede Entität und tauschen Sie die öffentlichen aus. Das Verfahren kann dann an beiden Enden angewendet werden.

Theoretisch sind e und d austauschbar (weshalb RSA funktioniert) (man muss als geheim bezeichnet und geheim gehalten werden), aber p und q müssen immer sein geheim gehalten, da diese es Ihnen ermöglichen, d von e abzuleiten und umgekehrt. Sie müssen jedoch beim Verständnis des privaten Schlüssels äußerst vorsichtig sein - speichert Ihre Software p/q im privaten Schlüssel? Wenn ja, können Sie es nicht so veröffentlichen, wie es ist. Auch wenn ich austauschbar sage - sobald Sie eines dieser Paare (e oder d zusammen mit Ihrem Modul n) veröffentlicht haben, müssen Sie das andere mit Ihrem Leben schützen. Praktisch gesehen wie Graeme in den Kommentaren verlinkt e wird oft als kleiner/fester Wert gewählt. Mein Kommentar, dass e/d austauschbar ist, trifft eindeutig nicht zu, wenn e leicht zu bestimmen ist. Wenn Sie so etwas tun, kann dies zu Verwirrung und Fehlimplementierung führen. Verwenden Sie eine Bibliothek eines Drittanbieters/veröffentlichen Sie keine privaten Schlüssel.

51
user2213

Ja, Sie können mit einem privaten Schlüssel verschlüsseln und mit einem öffentlichen Schlüssel entschlüsseln. Geben Sie Ihren privaten Schlüssel NICHT weiter (private Schlüssel können öffentliche Schlüssel generieren und Ihr gesamtes Verschlüsselungssystem ist jetzt unbrauchbar). Ich gehe davon aus, dass Sie so etwas tun möchten diese:

Der Server verschlüsselt Daten und sendet sie an Clients.

Clients haben einen öffentlichen Schlüssel und können Daten vom Server entschlüsseln.

Unter diesen Umständen wäre es sinnvoll, wenn der Server sowohl die Verschlüsselung als auch die Entschlüsselung durchführt. Ich habe keine Ahnung, warum Sie eine asymmetrische Krypto-Implementierung wünschen.

Die Regel gilt jedoch immer: Der private Schlüssel bleibt privat und verlässt den Server nicht.

9
StrangeWill

Angenommen, der Server soll Daten mit dem privaten Schlüssel verschlüsseln und mit dem öffentlichen Schlüssel entschlüsseln:

Der Server kann Daten mit seinem privaten Schlüssel verschlüsseln und der Empfänger kann mit den öffentlichen Schlüsseln des Servers entschlüsseln. Dies ist möglich. Dieses Szenario wird jedoch verwendet, um ein Dokument digital zu signieren, und wie Sie sagen, ist es "eine Möglichkeit, Daten zu verteilen, von denen überprüft werden kann, dass sie vom richtigen Server stammen", da nur der entsprechende Schlüssel (öffentlicher Schlüssel des Servers) verwendet werden kann um die Daten zu entschlüsseln. Der öffentliche Schlüssel des Servers wird durch das entsprechende digitale Zertifikat überprüft, das vom Server generiert und digital signiert wurde.

kann ich einfach den privaten Schlüssel veröffentlichen und den öffentlichen Schlüssel geheim halten?

Sie sollten den privaten Schlüssel niemals veröffentlichen, wie der Name schon sagt.

Beeinträchtigt dies die Sicherheit des Systems?

Ja, auch dieses System ist nicht funktionsfähig. Wenn Sie beispielsweise Diffie-Hellman (eines der am häufigsten verwendeten Schlüsselaustauschprotokolle) verwenden, müssen der Server und alle Clients öffentliche Werte gemeinsam nutzen, die zur Berechnung der Sitzungsschlüssel verwendet werden . Wenn Sie als Benutzer Ihren privaten Schlüssel veröffentlichen, ist es sehr einfach, den öffentlichen Schlüssel zu berechnen, was umgekehrt nicht möglich oder sehr schwierig ist.

2
Ishtiaq Hussain

Ich weiß nicht, ob Sie mit dem privaten Schlüssel verschlüsseln und mit dem öffentlichen Schlüssel entschlüsseln könnten, aber wenn Sie könnten, wäre es nicht sehr sicher, da der Entschlüsselungsschlüssel öffentlich ist - Ihr privater Schlüssel sollte privat bleiben.

Wenn Sie lediglich den Absender der Nachricht überprüfen möchten, signieren Sie die Daten stattdessen mit dem privaten Schlüssel des Absenders, und der Empfänger überprüft die Signatur mit dem öffentlichen Schlüssel des Absenders.

Wenn Sie sowohl die Daten verschlüsseln als auch den Absender überprüfen möchten, verschlüsseln und signieren Sie, wobei für beide keine Offenlegung des privaten Schlüssels erforderlich ist.

0
hmallett