Hallo, ich arbeite momentan an einem Flashgame.
Flash verbindet sich hierbei mit einem C# Server.
Alles funktioniert.
Ich verschlüssle die Nachrichten zwischen Client/Server mithilfe RSA's (public key Verschlüsselung)
Doch ein Problem habe ich:
Wie kann ich dem Client (für die Entschlüsselung) den private Key zukommen lassen?
Über ein Packet senden ist ja keine gute Idee, weil dann ja jemand den private key sniffen kann.
Wie funktioniert das? Habe ich evtl. das Konzept noch nicht ganz begriffen?
extinct
Asymetrische Verschlüsselung bedeutet das mit einem Schlüssel verschlüsselt und mit einem anderen (zugehörigen Schlüssel) entschlüsselt wird.
Der private Schlüssel gehört auf die Server (sichere) Seite, dann kannst Du zum entschlüsseln den public (öffentlich) Key einfach mitgeben.
Wird nicht mit dem public key verschlüsselt und mit dem private key entschlüsselt?
Weil wenn man mit dem private key verschlüsselt und den public key entschlüsselt, kann ja jeder die Nachricht entschlüsseln, da der Key ja public ist. Nennt man das dann nicht signieren? Oder habe ich einfach das Konzept der asymmetrischen Verschlüsselung nicht verstanden?
extinct
Doch das siehst du schon richtig.
Lies dich in SSL ein, da gibt es ein Verfahren zum Austausch von Schlüsseln. Wie genau das geht weiß ich nicht, aber Browser die auf https Seiten unterwegs sind machen z.B. das gleiche.
Oder einfacher: Generiere im Client ebenfalls einen privaten Schlüssel und übergib den verschlüsselt an den Server (mit privatem Key des Servers).
Hallo guest,
du hast die Situation, welchen Schlüssel man wofür benutzt, und den Unterschied zwischen Verschlüsseln und Signieren, korrekt beschrieben. Anderseits ist der zweite Satz von FZelle auch richtig. Das heißt, dass der private Schlüssel nicht übertragen werden sollte, sondern nur der öffentliche. Für bidirektionale Kommunikation generiert jeder Teilnehmer also sein eigenes Schlüsselpaar, behält seinen privaten und überträgt den öffentlichen Schlüssel an seinen Kommunikationspartner.
herbivore
PS: Eine Alternative wäre Diffie–Hellman key exchange.
Ok, also um alles nochmals einfach zusammenzufassen:
extinct
Asymetrische Verschlüsselung ist soweit ich mich erinnern kann recht rechenintensiv, weswegen man nach dem Aufbau der Verbindung, innerhalb der asymetrischen Verschlüsselung, einen generierten symetrischen Schlüssel austauschen kann, um dann anschließend symetrisch weiter zu kommunizieren.
Lg, XXX
Und soll jetzt der Client den private key bekommen, um die Antwort zu entschlüsseln?
extinct
Wenn beide Seiten den privaten Key kennen ist das relativ sinnfrei.
Der private Key wird immer nur zum Entschlüsseln verwendet.
Willst Du auf beiden Seiten entschlüsseln würde ich es als sauberen Weg bezeichnen, wenn es zwei öffentliche und zwei private Keys gibt - jeweils für Server und Client.
Da sinkt schon mal die Gefahr, dass "jemand" beide private Keys erhält.
Aber eben aufgrund der Last ist xxxprod's genannter Weg eher gängig.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ok, und wie sieht das jetzt praktisch aus?
Wie bekommt man das hin, dass beide private keys (der auf dem server und der auf de client) für die Entschlüsselung benutzt werden koennen. Da blick ich nochnicht ganz durch.
extinct
Google-Suche nach c# asymetric cryptography
Bitte beachte in Zukunft [Hinweis] Wie poste ich richtig? 1.1 und auch 2.3.( Ich hab nämlich keine Lust ständig Deine Full-Quotes zu entfernen 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Sowas in der Art habe ich schon 100000000 mal in google eingegeben, bin aber mit den Antworten nicht klar gekommen.
Ich will doch nur wissen, wie das funktioniet, dass beide private keys zum entschlüsseln funtionieren. Ich meine wenn man auf dem Server einen private key generiert und auf dem client einen anderen, kann das ja irgendwie garnicht funktionieren mit dem entschlüsseln. Weil es 2 verschiedene Keys sind.
extinct
Wieso sollte das nicht funktionieren?!
Server Generiert Schlüsselpar A(privat)/B(öffentlich)
Client Generiert Schlüsselpar X(privat)/Y(öffentlich)
Server sendet seinen öffentlichen Schlüssel (B) an Client. (unverschlüsselt)
client sendet seinen öffentlichen Schlüssel (Y) an Server. (unverschlüsselt)
Server sendet Nachrichten jetzt nur noch mit Y verschlüsselt -> Client kann mit X entschlüsseln.
Client sendet Nachrichten jetzt nur noch mit B verschlüsselt -> Server kann mit A entschlüsseln.
ist das denn so schwer zu verstehen?
Man kann es auch so machen, dass der Server an den Client den öffentlichen Schlüssel überträgt. Der Client generiert einen zufälligen key für eine symmetrische Verschlüsselung (zB Aes), verschlüsselt den Key mit dem Public key und sendet diesen an den Server. Dieser kann den Schlüssel mit dem Private Key entschlüsseln. Ab da wird dann symmetrisch verschlüsselt. Die asymmetrischen Verschlüsselungsalgorythmen sind auch eher nicht für große Datenmengen zu gebrauchen, eignen sich aber perfekt zum übertragen von symmetrischen Schlüsseln.
Spätestens jetzt sollte es aber wirklich klar sein. Es wurde ja nun schon mehrfach konkret gesagt, welcher Teilnehmer welchen Key wofür verwendet.