Forum: PC-Programmierung AES Datenübertragung C#


von Sebastian N. (sebastian_neusch)


Angehängte Dateien:

Lesenswert?

Hallo,

hab im Anhang ein C# 2010 Projekt, Es soll eine verschlüsselte 
Datenübertragung zu verfügung stellen, dieses Projekt ist derzeit nur 
der Client, bevor ich den Server schreibe, wollte ich mal alle hier 
fragen ob das so grob funktionieren kann. Ich wäre euch dankbar wenn ihr 
mir Tipps datzu gebt, auch in Sachen Sicherheit der Übertragung und 
Funktion.


Mit freundlichen Grüßen

Sebastian Neusch

von Sebastian N. (Gast)


Lesenswert?

Hat denn keiner eine grobe Meinung zu?

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Wozu? Mir erschließt sich der Sinn nicht. Außerdem ist unklar was du nun 
genau gemacht hast und was dein Ziel ist.

von Fred (Gast)


Lesenswert?

Immerhin schonmal CBC statt ECB.

Dennoch kannst das aus Sicherheitssicht in die Tonne kloppen: keine 
authenticated encryption.

von Bastler (Gast)


Lesenswert?

Ich sehe das so:

Der Client nimmt ein Passwort bzw Key des Users entgegen. Der andere 
User muss den selben Key verwenden (ausser senden und empfangen wird mit 
jeweils einem eigenen Key gemacht). Der Server vermittelt nur die Daten 
so das der Client zum anderen Client anonym (IP) bleibt.

Das einzige Problem wird der Schlüssel selber sein: wie kommt er sicher 
zum anderen User?

von Daniel H. (Firma: keine) (commander)


Lesenswert?

1. Wieviele Clients soll es geben?
2. Wie soll der Schlüssel sicher an die Clients übermittelt werden, wenn 
die Clients gegenseitig anonym bleiben sollen?
3. Darf der Server die Identität der Clients kennen?

Mein Vorschlag für ein einfaches Multi-User-System mit 
vertrauenswürdigem(!) Server bei dem die Clients lediglich die IP des 
jeweils anderen nicht wissen dürfen würde so aussehen:

Voraussetzung
1. Der Server verfügt über ein digitales Zertifikat
2. Clients nutzen zur Kommunikation mit dem Server TLS
3. Der Server vergibt an jeden Client eine eindeutige ID sowie einen 
einzigartigen, zufälligen AES-Schlüssel

Anwendung:
1. Clients verbinden sich per TLS zum Server, durch Prüfung des 
Zertifikats wird dessen Identität und Authentizität sichergestellt
2. Client A teilt dem Server mit, dass er mit Client B kommunizieren 
möchte.
3. Der Server sendet Client A den Schlüssel von Client B
4. Der Server teil Client B den Kommunikationswunsch mit und übermittelt 
ihm den Schlüssel von Client A
5. Bei der Kommunikation verschlüsselt Client A und mit dem Schlüssel 
von Client B und entschlüsselt mit seinem Schlüssel A. Client B 
verschlüsselt mit dem Schlüssel von Client A und entschlüsselt mit 
seinem Schlüssel B.

Das lässt sich jetzt noch beliebig weiter verfeinern, z.B. indem nicht 
direkt die Schlüssel von A und B verwendet werden sondern abgeleitete 
Session-Schlüssel, dadurch sind diese nur für eine Session gültig und 
der Originalschlüssel kann nicht von anderen Teilnehmern missbraucht 
werden, da er nur dem jeweiligen Client und dem Server bekannt ist. 
Voraussetzung hier: Server und Client sind in der Lage jeweils die 
gleiche Schlüsselableitung durchzuführen.

Viele Grüße
Daniel

von Sebastian N. (sebastian_neusch)


Lesenswert?

Also:
Es sollte nur einen server und einen client geben.
Ich will mit dem client den server fernsteuern, vorerst will ich aber 
nur dateien übertragen. Ich dachte an einen starken Namen des Clients, 
damit klar ist, dass nicht jemand "falsches" verbindet.
Zur Schlüsselübertragung habe ich direkt keine sichere Idee ich dachte 
an die Verschlüsselung des AES-Schlüssels (IV, Key) durch RSA.

von Sebastian N. (sebastian_neusch)


Lesenswert?

Ist die grundidee der verschlüsselten Übertragung oke?

von Stefan R. (srand)


Lesenswert?

Nein, aber das hat Fred ja schon gesagt.

von Riddler (Gast)


Lesenswert?

Einfach mal bei

http://de.wikipedia.org/wiki/Kryptografie

beginnen. Ohne rudimentäre Grundlagen kommst Du bei dem Thema nicht 
weit. Starke Verschlüsselung bekommst Du per Library. Die 
Schlüsselverteilung ist das Problem.

???

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Sebastian N. schrieb:
> Es sollte nur einen server und einen client geben.
> Ich will mit dem client den server fernsteuern, vorerst will ich aber
> nur dateien übertragen.

Dann nimm TLS mit Client-Authentisierung und tunnel dein 
Übertragungsprotokoll dadurch. Genau für solche Anwendungsfälle wurde 
TLS entworfen.

Irgendwas Eigenes zu basteln ohne über tiefere Krypto-Kenntnisse zu 
verfügen ist grob fahrlässig.

von Sebastian N. (sebastian_neusch)


Lesenswert?

Ok dann werde ich mich mal "n bisschen" informieren.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Sebastian N. schrieb:
> Ist die grundidee der verschlüsselten Übertragung oke?

Noch ein Nachtrag, die Grundidee etwas zu verschlüsseln ist nie verkehrt 
;)

Das Problem ist eben, wie du schon gemerkt hast, dass es mit 
Verschlüsselung alleine nicht getan ist. Die Verschlüsselung an sich ist 
eigentlich trivial. Man nehme einen (idealerweise verbreiteten und 
standardisierten) Algorithmus wie AES und ver-/entschlüssele damit 
Daten. Normalerweise kann man hier (Implementierungsfehler mal außen 
vor) nicht viel falsch machen. Die Herausforderung liegt leider an 
anderen Stellen:

1. Wie erzeugt man sichere Schlüssel?
2. Wie verteilt man Schlüssel sicher an die einzelnen Teilnehmer?
3. Wie sichert man die Authentizität der einzelnen Teilnehmer?
4. Wie sichert man die Authentizität/Integrität der übertragenen Daten?
5. Wie sichert man das System gegen Kompromittierung von Schlüsseln?
6. Wie sichert man das System gegen betrügerische Teilnehmer?
7. Usw. usw.

Daher auch mein Vorschlag mit TLS, da dir hierdurch schon einmal ein 
paar Sorgen genommen werden. Insbesondere kannst du damit schon einmal 
sicherstellen, dass jeder Teilnehmer über eine sichere Verbindung zum 
Server verfügt UND dass die Authentizität des Servers verifiziert werden 
kann, die Clients also dem Server vertrauen können.

Sofern es erlaubt ist, dass der Server die übertragenen Daten lesen kann 
bist du hier dann auch schon fast fertig, denn die verschlüsselte 
Übertragung wird ja bereits bereits per TLS erledigt, der Server muss 
also nur noch dafür sorgen, dass die Daten empfangen und dann zum 
richtigen Teilnehmer weitergeleitet werden.

Darf der Server die Daten nicht lesen wird es etwas komplizierter. Hier 
hatte ich in meinem vorigen Vorschlag einen Denkfehler, denn wenn der 
Server als Key Distribution Center arbeitet (also Schlüssel verteilt und 
speichert) kann er ja nach wie vor die Kommunikation mitlesen, wenn er 
möchte. Hier müsste man dann auf Clientseite mit digitalen Zertifikaten 
oder aber z.B. mit Diffie-Hellman-Schlüsselaustausch arbeiten. Letzterer 
ist jedoch ohne weitere Absicherung über Signaturen oder MACs anfällig 
für Man-in-the-middle-Angriffe.

Letztenendes kommt es also darauf an, welches Sicherheitsniveau du 
benötigst und welcher Teilnehmer im System was machen darf. Ist der 
Server vertrauenswürdig und darf alles mitlesen, dann brauchst du im 
Prinzip nur TLS und kannst deine Nutzdaten dann im Klartext darüber 
tunneln.

von Sebastian N. (Gast)


Lesenswert?


von Stefan R. (srand)


Lesenswert?

Daniel H. schrieb:
> Normalerweise kann man hier (Implementierungsfehler mal außen
> vor) nicht viel falsch machen.

Haha!

Nimm du mal OpenSSL her und stricke aus der API was sicheres zusammen.

Das kannst du nicht. Das kann ich nicht. Und niemand sonst hier im 
Forum.

Und deswegen gibt es mittlerweile Libraries mit High-Level-APIs für 
Normalsterbliche wie uns: Keyczar. cryptlib. NaCl.

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Beitrag nicht gelesen und/oder nicht verstanden?

Genau von selber Stricken habe ich abgeraten. Das von dir (aus dem 
Zusammenhang gerissene) Zitat bezieht sich allein darauf, dass die reine 
Durchführung der Verschlüsselung einfach ist und man nicht viel falsch 
machen kann wenn man standardisierte Algorithmen wie z.B. AES nutzt. Das 
ist aber eben nicht alles, was man berücksichtigen muss.

Stefan Rand schrieb:
> Nimm du mal OpenSSL her und stricke aus der API was sicheres zusammen.

Wie kommst du auf OpenSSL? Habe ich das irgendwo erwähnt? Ehrlich gesagt 
bist du der erste, der dieses Wort hier im Thread gepostet hast. 
Vielleicht den Beitrag wieder nicht richtig gelesen/verstanden? Dir ist 
schon bewusst, dass ich TLS nur das Protokoll ist?

Stefan Rand schrieb:
> Und deswegen gibt es mittlerweile Libraries mit High-Level-APIs für
> Normalsterbliche wie uns: Keyczar. cryptlib. NaCl.

Und OpenSSL ist eine Low-Level-API oder was? Nur weil du damit nicht 
umgehen kannst heißt das nicht, dass andere es nicht können.

Das nächste mal bitte erst nachdenken, bevor du deine überheblichen 
Worte in die Tastatur hackst.

Sebastian N. schrieb:
> Ist das folgende der richtige Ansatz:

Das sieht schonmal gut aus, aber im Detail habe ich es mir jetzt nicht 
weiter angeschaut.

: Bearbeitet durch User
von Stefan R. (srand)


Lesenswert?

Daniel H. schrieb:
> Beitrag nicht gelesen und/oder nicht verstanden?

Dafür, daß du keine Ahnung hast, riskierst du aber ne dicke Lippe.

> Genau von selber Stricken habe ich abgeraten. Das von dir (aus dem
> Zusammenhang gerissene) Zitat bezieht sich allein darauf, dass die reine
> Durchführung der Verschlüsselung einfach ist und man nicht viel falsch
> machen kann wenn man standardisierte Algorithmen wie z.B. AES nutzt. Das
> ist aber eben nicht alles, was man berücksichtigen muss.

Haha.

Zeig mal, wie du AES implementierst.

AES ist verdammt schwierig zu implementieren, wenn man Timing-Attacken 
ausschließen will.

> Stefan Rand schrieb:
>> Nimm du mal OpenSSL her und stricke aus der API was sicheres zusammen.
>
> Wie kommst du auf OpenSSL? Habe ich das irgendwo erwähnt? Ehrlich gesagt

Mir war nicht klar, daß du Krypto selbst implementieren willst. Aber daß 
jemand so idiotische Ideen hat, damit muß man auch nicht rechnen.

Und so ziemlich jeder, der nach gut abgehangenen und reviewten 
Krypto-Primitiven mit Bindings in so ziemlich alle Sprachen sucht, nimmt 
OpenSSL. Oder was würdest du nehmen, außer natürlich deinem 
Eigen-Gefrickel?

> Vielleicht den Beitrag wieder nicht richtig gelesen/verstanden? Dir ist
> schon bewusst, dass ich TLS nur das Protokoll ist?

Du bist TLS nur das Protokoll. Soso. Stell die Flasche weg.

> Stefan Rand schrieb:
>> Und deswegen gibt es mittlerweile Libraries mit High-Level-APIs für
>> Normalsterbliche wie uns: Keyczar. cryptlib. NaCl.
>
> Und OpenSSL ist eine Low-Level-API oder was? Nur weil du damit nicht

Ja, ist es.

Sag mal, hast du überhaupt schonmal grob gehört, was NaCl oder Keyczar 
sind und machen?

> umgehen kannst heißt das nicht, dass andere es nicht können.

Ja, ein paar Leute können das. Du und ich nicht.

> Das nächste mal bitte erst nachdenken, bevor du deine überheblichen
> Worte in die Tastatur hackst.

Ich finde es schön, daß ich dich so aufregen konnte.

Mehr als ad-hominem kommt von dir aber eh nicht, deshalb: Tür zu! Von 
außen!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan Rand schrieb:
> Tür zu! Von außen!
Richtig. Zankt euch per PN weiter. Es bringt auch nichts, wenn jeweils 
der Eine den Post vom Anderen meldet...

von Daniel H. (Firma: keine) (commander)


Lesenswert?

Hallo,

warum gräbst du den Thread nach neun Tagen wieder aus nachdem hier nun 
Ruhe herrschte?

Ich hab ihm eine PN geschrieben und meinen Standpunkt dargelegt, darauf 
kam seither keine Reaktion, also ist die Sache für mich gegessen, ich 
gehe nach wie vor davon aus, dass wir hier ein massives Missverständnis 
hatten.

Viele Grüße
Daniel

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.