[Visual c#.NET] RSA-TCP Verbindung

Registriert
Dez. 2009
Beiträge
213
Hi, ich möchte eine gesicherte Verbindung per TCP aufbauen.
Lösung: Die Anweisungen, welche über die Verbindung laufen, werden einfach AES-MD5-256Bit verschlüsselt.

Doch jetzt muss vor jeder gesicherten Verbindung ein AES-Schlüssel gesichert ausgetauscht werden. Das macht RSA. Doch wie kann man in .NET assymetrisch per RSA verschlüsseln?

Hinweis: Es braucht mir niemand Antworten, wie ich AES-Verschlüssele oder TCP-Verbindungen mache. Das weiß ich schon!
Wer nicht wirklich weiß, was RSA macht braucht, für den ist dieses Thema nichts.
 
Ich würde den RSACryptoServiceProvider dafür verwenden.

System.Security.Cryptography.RSACryptoServiceProvider

Zur Anwendung kannst du verschiedene Möglichkeiten in Betracht ziehen.

1. Du generierst mit dem Provider für den Server 2 BLOBs, der eine enthält sowohl Public als auch Private Key und der andere nur den Public Key. Im Client verwendest du den Public Key des 2. Blobs um den Session Key deiner AES Verschlüsselung zu verschlüsseln. Der Server verwendet aus dem 1. Blob den Private Key um den verschlüsselten Sessionkey wieder zu entschlüsseln. (Ist riskant wenn der Server gehackt wurde und der Private Schlüssel ermittelt werden konnte)

2. Beide Keys werden on demand erzeugt und jeweils nur der Public Key an die Gegenstelle gesendet. Kommunikation läuft dann erstmal über die Verschlüsselung mit den Public Keys und Entschlüsselung mit den Private Keys bis der Sessionkey für AES ausgetauscht ist. (Ist riskant da hier Men-in-the-middle Attacken möglich wären)
 
Zuletzt bearbeitet:
Die zweite Möglichkeit ist besser und wird auch normalerweise verwendet. Ich denke mit den Man-In-The-Middle-Attacken meinst du, dass jemand per public-Key Pakete mit einschleust und so einen eigenen AES generiert. Zwei Fragen ergeben sich daraus:

1. Wie verwende ich die RSACryptoServiceProvider Klasse, gibt es dafür Beispiele?
(Was sind eigentlich BLOBs?)

2. Wie verhindere ich die Man-in-the-Middel-Attacken? Diese Frage ist erst mal nicht so wichtig, erst mal sollts grob funktionieren.

Hast du da auch noch ne Antwort?
 
zu 1) sicher gibt es da Beispiele für die Verwendung, siehe MSDN oder frag Google. Der Name der Klasse sollte reichen um genug darüber zu finden, sei also mal etwas aktiver und las es dir nicht vorkauen.

BLOB : Binary Large Object, heißt einfach nur eine Ansammlung von Bytes, die in diesem Fall den Public bzw. den Private Key darstellen

zu 2)
Mit Man-In-The-Middle-Attacke meine ich, das sowohl der Client als auch der Server nicht wirklich sicher wissen das die Anfrage für den Public-Key auch vom Client selbst stammt, wenn diese stets dynamisch generiert werden. Also es geht darum das sich ein Angreifer zwischen die Kommunikation der beiden Rechner klemmt, in dem er gegenüber dem Client so tut als ob er der Server wäre (mit seinem eigenen Public und Private Key), diese Info schickt er an den Client der seinerseits denkt er kommuniziert mit dem Server. Der Attacker baut dann eine 2. Verbindung zum Server auf und behauptet er wäre der Client (auch wieder mit seinem Public/Private Key). Jede Kommunikation wird dann über den Attacker geschleust, ala

1. Client sendet Daten verschlüsselt mit dem Public Key an den Attacker
2. Attacker entschlüsselt die Daten, macht damit was er will, verschlüsselt sie aber mit dem Public Key des Servers und sendet diese an den Server
3. Server empfängt die verschlüsselten Daten des Attackers, verwendet den Public Key des Attackers um seine Antwort zu verschlüsseln und sendet diese zurück an den Attacker, der für Ihn der Client ist
4. Attacker empfängt die Daten entschlüsselt diese, macht damit was er will und verschlüsselt dann mit dem Public Key des Clients und sendet diese dem Client
5. Client empfängt die Daten, entschlüsselt diese da er glaubt diese Daten vom Server bekommen zu haben

Auf diesem Wege braucht der Attacker keinen Private Key von den anderen und kann dennoch die Kommunikation vollständig überwachen. Der Sessionkey für AES wäre somit nicht mehr sicher. Man könnte das Umgehen in dem man eine für beide Seiten glaubwürdige 3. Partei zu rate zieht, die die Public Key der einzelnen Kommunikationspartner verwaltet und auf Anfrage an die anderen Kommunikationspartner sendet. Somit wäre es für einen Attacker etwas schwieriger da er nicht mehr ohne weiteres sich zwischen die Kommunikation beider Parteien schleusen kann.
 
Zuletzt bearbeitet:
Um sich sicher auf einen Schlüssel zu einigen gibt es doch Diffie-Hellman. Warum nicht ein Verfahren nutzen, dass für deinen Zweck gedacht ist?
Und um MITM-Attacken zu verhindern, könnte man über einen zweiten Kanal einen Hash des Schlüssels übermitteln und den beim Aufbau
der Verbindung überprüfen.

Eine andere Möglichkeit wäre es, Zertifikate zu verwenden, die von einer vertrauenswürdigen Stelle ausgestellt wurden, oder ein Web-Of-Trust,
wie es bei PGP/GPG zum Einsatz kommt.
 
Zuletzt bearbeitet:
Das mit dem Man-In-The-Middle-Attacken hättest du mir nicht erklären müssen, die Bezeichnung ist aussagekräftig. Zu asdfmann: Das hört sich sehr kompliziert an, gibt es da eine Klasse für die Diffie-Hellman Anwendung? Was ist das überhaupt genau. Ich weiß nur, dass bei gesicherten Verbindungen oft vorerst RSA angewendet wird, dann werden AES-Schlüssel ausgetauscht und dann gehts nur noch mit dem sichersten AES.
 
ob Diffie Hellman oder RSA ist relativ, können beide den Zweck des Schlüsseltauschs übernehmen, 100%ige Sicherheit wird es niemals geben von daher würde ich nur eine gewisse Grundsicherheit anstreben, welche mit dem von dir angesprochenen Konzept gegeben sein sollte.
 
haze4real hat vollkommen Recht. Es geht mir nur darum, dass nicht jeder Depp per Netzwerksniffer den gesamten Verkehr verfolgen kann.
Hier habe ich alles zur RSA-Verschlüsselung gefunden:

http://msdn.microsoft.com/en-us/library/system.security.cryptography.rsacryptoserviceprovider.aspx

Sorry, der Link Button funzt in meinem Uralt-Browser nicht.

Vielen Dank für eure Antworten, wem noch einfällt, wie die Man-In-The-Middle-Attacken abzuwehren sind, kann ja noch posten.
Ergänzung ()

Hat doch gefunzt^^
 
Zurück
Oben