DotNETWork: Generische TCP/IP und UDP Klasse

    • C#
    • .NET (FX) 4.5–4.8

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

      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.
      Und Gott alleine weiß alles am allerbesten und besser.
      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.
      Und Gott alleine weiß alles am allerbesten und besser.
      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?
      Und Gott alleine weiß alles am allerbesten und besser.
      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. ^^
      @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?
      Und Gott alleine weiß alles am allerbesten und besser.

      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 )

      Und Gott alleine weiß alles am allerbesten und besser.

      φ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.
      Und Gott alleine weiß alles am allerbesten und besser.

      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, 225 mal angesehen
      • 2.png

        10,74 kB, 497×245, 253 mal angesehen
      Und Gott alleine weiß alles am allerbesten und besser.
      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, 196 mal angesehen
      Dateien
      • Example.zip

        (19,9 kB, 144 mal heruntergeladen, zuletzt: )
      Und Gott alleine weiß alles am allerbesten und besser.