Laden...

Filestream zu Memorystream dann übertragen

Erstellt von Unfug vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.042 Views
U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 5 Jahren
Filestream zu Memorystream dann übertragen

Hallo zusammen,

mir fiel leider kein passender Threadtitel ein. Es geht darum, dass ich derzeit folgendes Szenario versuche:

  1. Laden eines Filestreams
  2. Daten verschlüsseln
  3. Daten übertragen

Was derzeit funktioniert ist, dass ich z.B. eine Datei lade, die Bytes auslese, verschlüssel und wieder speichere als Datei.

Jetzt könnte ich die verschlüsselte Datei wieder Laden und übertragen.

Mein Ziel ist es aber, dass dies on-the-fly geschieht.

Ich habe folgendes bisher (vereinfacht):


    using (var stream = new FileStream(@"c:\temp\test.pdf", FileMode.Open))
    using (var encryptedstream = new MemoryStream())
{
 Encrypt(stream, encryptedstream);
 Übertrage(encryptedstream);
}

Idee war, dass ich in Encrypt den Memorystream übergebe und der Memorystream solange gefüllt wird bis das Auslesen der Datei beendet ist. Parallel sollte dann in Übertrage() die bereits verschlüsselten Bytes übertragen werden.

Lasse ich die Verschlüsselung weg und übertrage nur den stream funktioniert auch alles.
Sobald ich aber den encryptedstream übertragen möchte, läuft der unendlich lang bzw. bis zum Timeout.

Innerhalb von Encrypt wird ausschließlich das hier gemacht


  var key="testkey";
  var iv = "testiv;
   byte[] buffer = new byte[1024];
            while (stream.Read(buffer, 0, buffer.Length)>0)
            {
               var encryptedbuffer = EncryptToAES(buffer, key, iv);
                encryptedStream.Write(encryptedbuffer, 0, encryptedbuffer.Length);

            }
            return encryptedStream;

Auf der anderen Seite kommt auch ein Stream an mit der korrekten Content.Length. Allerdings scheint die Übertragung nicht durchgeführt zu werden.

Ich sehe glaube ich den Wald vor läuter Bäumen nicht.

Danke

UPDATE:
Kleines Update am Rande. Das Problem, dass die verschlüsselten Daten generell nicht übertragen wurden lag daran, dass der Positionszeiger des encryptedstream bei encryptedStream.Write mit hochgezählt wird.

Sobald man:
encryptedStream.Position = 0;
setzt. Werden auch die Daten übertragen. Ich vermute, dass man jetzt einen temporären Counter für die Position benötigt.
Da eine Stelle in den Stream reinschreibt und die andere ausliest, benötigt man sozusagen 2 Positionen.

Ich werde das später nochmal genauer testen und hier Feedback geben.

6.911 Beiträge seit 2009
vor 5 Jahren

Hallo Unfug,

nimm zum Verschlüsseln den CryptoStream, somit hast du nur Streams und kannst den Input zum Output kopieren (i.e. von Stream zu Stream weiterreichen).

Z.B.


private async Task SendEncrypted(Stream input, Stream output, CancellationToken ct = default)
{
	using (var aes = Aes.Create())
	using (var transform = aes.CreateEncryptor())
	using (var encryptor = new CryptoStream(output, transform, CryptoStreamMode.Write))
	{
		await input.CopyToAsync(encryptor, ct);
	}
}

So kann input ein FileStream sein und output ein NetworkStream zum Übertragen.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

U
Unfug Themenstarter:in
133 Beiträge seit 2006
vor 5 Jahren

Ach danke.
Das probiere ich gleich mal aus. Da hätte ich mir ja die ganze Arbeit sparen können.