OTFCrypt: Stream on the fly ver- und entschlüsseln

    • Release

    Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von niwax.

      OTFCrypt: Stream on the fly ver- und entschlüsseln

      Einfache Erklärung: Ich hatte die Idee, dass es ganz praktisch wäre, Streams, die Beispielsweise über das Netzwerk gehen zu verschlüsseln, dass nicht jeder mitlesen kann. Dabei braucht man aber entweder komplizierte Algorithmen, muss mit Passwörtern hantieren, oder eigene Streams erstellen. OTFCrypt umgeht das, indem es eine Klasse bereitstellt, die sich einfach auf jeden Stream anwenden lässt.

      Ein Beispiel:

      VB.NET-Quellcode

      1. ' Ohne Verschlüsselung:
      2. Dim MeinStream As New IO.MemoryStream(1024)
      3. Dim TextSchreiber As New IO.StreamWriter(MeinStream)
      4. TextSchreiber.Write("Hello World")
      5. TextSchreiber.Close()
      6. MeinStream.Close()
      7. ' Mit Verschlüsselung:
      8. Dim MeinStream As New IO.MemoryStream(1024)
      9. Dim OTFCrypt As New OTFCryptedStream(MeinStream)
      10. Dim TextSchreiber As New IO.StreamWriter(OTFCrypt)
      11. TextSchreiber.Write("Hello World")
      12. TextSchreiber.Close()
      13. OTFCrypt.Close()
      14. MeinStream.Close()


      Wie man sieht, wird die Verschlüssellung einfach zwischen die Streams geschaltet, ohne das man sonst etwas machen müsste. Der Algorithmus basiert dann darauf, dass das aktuelle Byte so verschlüsselt wird:

      Bn = Bn xor Bn-1

      Dadurch muss man um das aktuelle Byte zu entschlüsseln das Vorhergehende kennen und so weiter. Am Anfang, wenn es kein vorhergehendes Byte gibt, wird eine Zufallszahl genommen, die ebenfalls übermittelt wird. Der Vorteil an dieser Sache ist, dass es nahezu unmöglich ist, einen Netzwerkstream vom ersten Byte an mitzuschreiben. Daher wird man sofort "abgehängt" und hat mit jedem übermittelten Byte eine 256-fache geringere Wahrscheinlichkeit, doch noch alles so weit zu entschlüsseln, dass man den Stream wieder mitlesen kann.

      Beim Entwurf der Bibliothek spielte noch ein weiterer Faktor eine Rolle: Da die Verschlüsselung direkt im Stream on the fly, also während die Daten durchgehen, stattfindet sollte es möglichst effizient sein. Bei einem Versuch auf einem relativ durchschnittlichen Computer bekam ich diese Werte:

      Lesen und Schreiben ein Prozessorkern:
      x86: 2,564 GBit/s
      x64: 2,547 GBit/s

      Lesen und Schreiben vier Prozessorkerne:
      x86: 8,840 GBit/s
      x64: 9,678 GBit/s

      Das übersteigt die Bandbreite der meisten Verbindungen, also kann man die Funktionen auch in Anwendungen benutzen, die möglichst schnelle Netzwerkstreams brauchen.

      Wenns verwendet wird wär ne Nennung im About-Dialog (falls vorhanden) ganz nett.
      Zu dekompilieren gibts eh nix was ich net schon gesagt hätte also macht euch die Mühe gar nicht erst.
      Dateien
      • otfcrypt.zip

        (4,84 kB, 73 mal heruntergeladen, zuletzt: )

      niwax schrieb:

      Daher wird man sofort "abgehängt" und hat mit jedem übermittelten Byte eine 256-fache geringere Wahrscheinlichkeit, doch noch alles so weit zu entschlüsseln, dass man den Stream wieder mitlesen kann.
      Das funktioniert aber nur gut bei Binärdaten. Bei Text könnte man ja 256-mal probieren, ob was sinnvolles herauskommt, ist ja im Vergleich zu 20-stelligen Passwörtern ja schnell erledigt.

      lg SeriTools
      | Keine Fragen per PN oder Skype.

      SeriTools schrieb:

      niwax schrieb:

      Daher wird man sofort "abgehängt" und hat mit jedem übermittelten Byte eine 256-fache geringere Wahrscheinlichkeit, doch noch alles so weit zu entschlüsseln, dass man den Stream wieder mitlesen kann.
      Das funktioniert aber nur gut bei Binärdaten. Bei Text könnte man ja 256-mal probieren, ob was sinnvolles herauskommt, ist ja im Vergleich zu 20-stelligen Passwörtern ja schnell erledigt.

      lg SeriTools

      Ja, aber da kommt zB die Entscheidung dazu, was sinnvolle Daten sind. Um dann herauszufinden, ob man den richtigen Startwert hat, müsste man zB alle Bytes mit einem Wörterbuch abgleichen oder einen Mensch davorsetzen, der aber niemals 256-Mal schneller sein kann als ein Netzwerkstream.

      SeriTools schrieb:

      Braucht er ja auch nicht :D Er kann ja einmal den Stream zuende sniffen lassen und dann ausprobieren. Dafür muss er nicht schneller sein als der Stream.

      Oder hab ich dich missverstanden?

      lg SeriTools


      Ja ok, aber wenn sniffen und vieeel Zeit eine Option ist, ist es egal, wie man verschlüsselt.
      Ach so, aber das ist hier ja nicht Sinn der Sache, es geht ja darum, fertige Streams zu verschlüsseln. Wenn du Datenblöcke verschlüsseln willst, nimm AES oder Blowfish, das ist auch nicht so schwer zu implementieren (Hat hier im Forum mehrere Libs).
      Das meine ich ja. Aber statt sich nur auf das vorhergehende Bit mit ner xor operation hzu bezihen, kannst auch nenn buffer mit z.b. 1kb erstellen, den verschlüsseln und dann erst senden und nicht byteweise. das müsste doch genause gehen und wäre genauso transparent