DotNETWork: Generische TCP/IP und UDP Klasse

    • C#
    • .NET 4.5

    Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von φConst.

      Jetzt mal weg von OT.

      Fändet ihr es besser, wenn der Server das Byte Array nicht dechiffrieren könnte?
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)

      φConst schrieb:

      Fändet ihr es besser, wenn der Server das Byte Array nicht dechiffrieren könnte?
      erkläre dich
      Post-AGB:
      §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
      §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
      Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
      §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
      Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
      Zurzeit ist folgendes implementiert:

      Server sendet an Client Public-Key.
      Client sendet an Server Public-Key.

      Client senden Nachricht -> verschlüsselt mit Public Key des Servers.
      Server empfängt, dechiffriert die Nachricht mit dem Server-Private-Key , und entschlüsselt wiederum mit dem Public Key des
      jeweiligen Clients und sendet dann.

      Konsequenz: Eingehende und ausgehende Information sowohl vom Server als auch vom Client sind verschlüsselt.
      Problematik: Der Server kennt den Klartext der Nachricht des Clients.
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)

      φConst schrieb:

      Problematik: Der Server kennt den Klartext der Nachricht des Clients.
      Dies ist nun Definitionssache. Als Transportverschlüsselung ist das in Ordnung,

      Ich persönlich sehe hier aber ein völlig anderes Problem. MITM-Angriffe.
      Post-AGB:
      §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
      §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
      Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
      §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
      Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
      MITM Angriffe sind imho doch eigentlich ausgeschlossen.

      Wenn jemand sich in die Verbindung einklinkt, erhält er nur die chiffrierte Nachricht.
      Nur die Server-APPLIKATION ist in der Lage den Text zu dechiffrieren.

      Sonst ist er perpetuell chiffriert, und nie, wenn es gesendet wird, dechiffriert.
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)
      Hm, ist die Annahme richtig, dass wenn die Maschine ,die der Server zu sein scheint, angepingt wird,
      äquivalente IPs haben?
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)
      Mir war grade eingefallen, dass der Server den Public Key auf eine Website hochlädt, die eine Authentifizierung voraussetzt,
      die dann vom Client heruntergeladen werden kann unter der spezifischen Server Ip.

      Das Problem ist aber auch hier, dass die Seite, von der er den Schlüssel lädt, durch Manipulation der host Datei einfach
      durch den Angreifer ausgetauscht werden kann .

      Habe mir dann überlegt, dass jene Seite einfach SSL verwendet.. aber das wäre im Endeffekt mit Kosten verbunden( Server mieten ).

      Alternativ könnte ich aber einen SslStream verwenden.

      Wie würdet ihr vorgehen?
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)
      Wenn ich deine Library benutzen sollte, dann gib mir einfach die Möglichkeit, die RSA-Keys selbst festzulegen. Dann kann ich z.B. auf dem Server das Schlüsselpaar generieren und alle Clients mit dem Public-Key ausstatten. Damit kann dann der Client bereits die erste Nachricht nur für den Server lesbar verschlüsseln, und brauch nicht zur Laufzeit 4096-Bit starke Schlüssel generieren.
      2 Fliegen mit einer Klappe ;)

      Optional kann man natürlich auch den SSL-Stream implementieren. Brauch man dann halt ein Zertifikat für, aber dank StartSSL usw. gibts die ja schon recht günstig. ^^
      Post-AGB:
      §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
      §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
      Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
      §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
      Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen
      @EaranMaleasi Gute Idee!
      Nur ist doch eigentlich das Problem, dass RSACryptoServiceProvider den Schlüssel automatisch generiert.
      Ich kann zwar den Schlüssel bei RijndaelManaged setzen, bringt aber meines Erachtens nichts, weil ja die PublicKey XML schon generiert wurde.

      Über welche Eigenschaften der Klasse CspParameters kann ich den Schlüssel setzen?

      Edit: ImportParameters, natürlich.

      Na..trotzdessen, wie soll der Benutzer nun die richtigen Werte für Modulus P Q et cetera setzen?
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „φConst“ ()

      In Kürze erfolgt ein (klein-großes) Update:

      Features

      -Individuelle Keys!
      -"Hardcoded" Hash , zur Verifikation des Public-Keys(Prävention von MITM Angriffen)
      -Direct-TcpClient ( Kommunikation zwischen Client-Client )

      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)
      Ein Konspekt über das Video wäre nicht allzu fatal.

      Werde es mir aber angucken.
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)

      φConst schrieb:

      Ein Konspekt über das Video wäre nicht allzu fatal.
      Davon abgesehen, dass Du hier im Forum auch ruhig "normales" Deutsch verwenden kannst, muss ich dazu sagen: Schau's Dir wirklich einfach mal an. Es ist sehr informativ und interessant, denn er bringt sehr gut auf den Punkt, was man in der Kryptographie machen und was man nicht machen sollte. Dabei werden auch die wichtigsten Irrtümer und Fehler genannt und z.B. auch die Schwachstellen von RSA aufgezeigt (Primzahlen ungeschickt gewählt...).

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      @Trade Nein, sorry, werde ich nicht.. Aber ich will mit meiner Ausdrucksform niemanden provozieren, nur wüsste ich gerne,
      wieso dies überhaupt provoziert.

      Provoziert es dich, oder euch?
      Ich bitte um Verzeihung.

      Ich werde mir das Video auf jeden Fall ansehen.
      Siehst du , oder dein Vorposter etwa schon einen Fehler?

      Hab es mir angesehen.
      Jo, klar, jemand macht sich auch die Mühe Timing-Angriffe zu starten oder mit einem Richtmikrofon meine CPU zu belauschen.
      Ich habe nie gesagt, war auch nie intendiert, einen eigenen kryptographischen Algorithmus zu implementieren.
      Es tut mir leid, das Video war zwar sehr interessant, besonders der Part mit den Angriffsmöglichkeiten von RSA , doch
      erschließt sich mir nicht der Zweck des Postings.

      Übrigens,
      Server-Client Sicherheit: Fragen.

      Antworten sehr gerne gesehen :)

      Edit: Einzig der Part mit dem Salting war in diesem Fall sinnvoll.
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)

      Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „φConst“ ()

      Hash-Verifikation

      Guten Abend,
      ich habe wie angekündigt die Verifikation durch einen Hash implementiert.

      Wie funktioniert es ?
      (Siehe Anhänge)

      Der Entwickler muss einen Schlüsselsatz im Konstruktor definieren:

      C#-Quellcode

      1. [/size] DotTcpServer<User> tcpServer = new DotTcpServer<User>(225, "ptr_cg^YvBCkLw$SRLe!AC$FPfHrj&Vw59EEVz%qQ^xEthcrPANK_FE*tf&bGdcxYr*_s-RSwu3@eu#7v!4Rhqud7u3P*&TEkcCf+B4-Xptt!QAcsjcbm3WFNqUgSQvd8ysBrCrg=?mB#3_Fm5-_*c9KE99B#WMyMW-HP8#E#%CeC*uFGnpf2zemh28-jJXPHX8p%-*RvGwQ-?KSMB&D-b6+zCy6FcSuas?fRbGL*eCT?wUt*gHfTc9*cXSaC@10");[size=14]


      Einen Random-String könnt ihr mit dieser Methode generieren:
      [tabmenu]

      C#-Quellcode

      1. public static string GenerateRandomKeyContainerName(int nameLength)
      2. {
      3. if (nameLength % 2 != 0)
      4. throw new Exception("Parameter nameLength must be a power of 2!");
      5. string resultText = "";
      6. string keyCharacters = @"abcdefghijklmnopqrstuvwxyz1234567890!§$%&()=?´'.:-^°@#+-*/[]{}\";
      7. for (int i = 0; i < nameLength; i++)
      8. {
      9. resultText += Random.NextDouble() >= 0.5 ? keyCharacters.Substring(Random.Next(0, keyCharacters.Length), 1).ToUpper() : keyCharacters.Substring(Random.Next(0, keyCharacters.Length), 1);
      10. }
      11. return resultText;
      12. }[size=14]
      [/size][/tabmenu]


      Jetzt empfiehlt es sich, die Command-Prompt zu starten, zum Debug Ordner zu navigieren und die kompilierte Exe auszuführen.
      Es wird den Verifikations-Hash wiedergeben ( siehe Anhang 1).

      Diese müsst ihr in euren Zwischenspeicher kopieren.

      Wenn ihr nun den Client entwickelt,
      müsst ihr ihm diesen Hash zuweisen:

      C#-Quellcode

      1. DotTcpClient tcpClient = new DotTcpClient("192.168.0.215", 225, Utilities.GenerateRandomKeyContainerName(256));
      2. tcpClient.SetVerificationHash("6F-F7-F3-CB-84-B4-C5-9F-CA-E5-EC-A3-A2-2C-FA-2A");


      Fertig!

      Wenn nun jemand seinen eigenen Public-Key versendet (MITM Angriff) wird der Benutzer gewarnt und die Verbindung wird geschlossen ( Anhang 2 ).

      Source im Start-Post unter GitHub.

      Liebe Grüße ( =
      Bilder
      • 1.png

        4,81 kB, 677×343, 135 mal angesehen
      • 2.png

        10,74 kB, 497×245, 160 mal angesehen
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)
      Neues Update:

      Es wird möglich sein Nachrichten direkt an einen Nutzer zu senden ohne das der Server den Inhalt dieser Nachricht kennt.

      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)
      NEUES UPDATE

      github.com/NET-D3v3l0p3r/DotNETWork/tree/master/Tcp

      Direct-Client wird nun unterstützt.

      Exemplarisches Programm im Anhang!
      Bilder
      • example.png

        16,87 kB, 1.341×657, 86 mal angesehen
      Dateien
      • Example.zip

        (19,9 kB, 50 mal heruntergeladen, zuletzt: )
      DotNETWork (Generische Tcp-Klasse, verschlüsselt!)
      MonogameMinecraftClone (Minecraft-Klon)
      NeuroEvolution (Implementation zweier Lernmethoden für neuronale Netze)