Wie erstelle ich einen bidirektionalen verschlüsselten Stream auf einem zugrunde liegenden .NET-Stream?

8

Ich habe einen Stream, der Daten über einen unsicheren Kanal sendet und empfängt. Ich habe ein vorher geteiltes Geheimnis, das beide Endpunkte des Kanals bereits haben (sagen wir eine Passphrase).

Ich möchte einen neuen Stream mit dem geheimen und dem ursprünglichen unsicheren Stream erstellen. Die zwei Probleme, auf die ich gestoßen bin, sind:

  • CryptoStream ist unidirektional: schreibgeschützt oder schreibgeschützt. Ich kann zwei Streams (einen Lese- und einen Schreibstream) über meinem ursprünglichen Stream erstellen, aber das ist inakzeptabel. Muss ich einen Wrapper-Stream schreiben, um zu bekommen, was ich will? (nämlich ein einzelner Lese- / Schreib-Stream)

  • CryptoStream funktioniert in Blöcken und schreibt möglicherweise nichts in den zugrunde liegenden Stream, bis der Block vollständig ist. Idealerweise möchte ich eine beliebige Menge an Daten schreiben und sie sofort an den zugrunde liegenden Stream senden (verschlüsselt).

Gibt es einen einfachen Weg, dies zu erreichen? Ich kenne SslStream, aber es ist eher auf private / öffentliche Schlüssel und Zertifikate zugeschnitten, als auf vorher geteilte Geheimnisse.

    
Roman Starkov 16.07.2011, 12:28
quelle

2 Antworten

5

Ich bezweifle, dass Sie zwei Jahre später wiederkommen und eine Antwort akzeptieren werden, aber ich habe einfach getan, worum Sie gebeten haben, und ich denke, dass es ein ziemlich häufiges Problem ist, deshalb poste ich dies für andere, die vielleicht auftauchen diese Frage.

Ich habe die Informationen von GregS in meine Implementierung integriert. Für Ihren speziellen Zweck würden Sie die Initialize-Methode zu Ihrem Konstruktor machen, den Netz- & amp; Diffie-Hellman-Code, und weisen Sie Ihren Pre-Shared-Key dem Aes-Objekt zu (anstelle des generierten Schlüssels).

Bitte beachten Sie, dass ich AES256 verwende, obwohl es kompromittiert wurde, um eine ähnliche Stärke wie AES128 aufzuweisen (wenn Ihre Schlüssel wegen einer schlechten Implementierung verwandt sind, die meines Wissens nicht bekannt sind). Wenn Sie NIST nicht vertrauen, um zu wissen, ob die NSA mit ihren Spezifikationen unordentlich ist, dann verwenden Sie KEINES AES.

Auch dies ist ein Ausgangspunkt! Ich arbeite durch das häufig auftretende Problem des Sendens verschlüsselter Daten über einen NetworkStream in .NET!

In einhundertzwölf Zeilen oder weniger, ohne weiteres:

%Vor%     
Vreenak 15.11.2013, 05:00
quelle
2

Sie müssen IVs korrekt übertragen und lesen, aber Sie können eine Blockchiffre, z. B. AES, im CFB-Modus mit einer Rückkopplungsgröße von 8 Bit verwenden, um die "blockige" Begrenzung zu beseitigen. Ich denke, du musst deinen eigenen Krypto-Stream schreiben, um das gewünschte bidirektionale Verhalten zu erhalten.

Erzeugen Sie auf der Verschlüsselungsseite des Streams eine zufällige IV und übertragen Sie sie zuerst. Lesen Sie auf der Entschlüsselungsseite zunächst die IV-Bytes aus dem Stream, initialisieren Sie dann die Chiffriertransformation und übergeben Sie dann die verbleibenden Bytes, die aus dem Stream gelesen wurden, durch die Kryptotransformation.

Wenn Sie bereit sind, die Bouncycastle C # -Bibliothek zu verwenden, können Sie die Vorteile der gesamten Sicherheitstechnik und -analyse nutzen in TLS / SSL mithilfe von vorab freigegebenen Schlüsseln mithilfe der Klasse SrpTlsClient . Diese Klasse implementiert die SRP-Verschlüsselungssätze in TLS.

BEARBEITEN:

Über SRP TLS ist nichts bekannt, die Bouncycastle-Bibliothek hat nur die Client-Seite des Protokolls. Schade.

    
James K Polk 16.07.2011 12:58
quelle

Tags und Links