Benutzer mit den meisten Antworten
Problem mit Streams bei der Ver/Entschlüsselung

Frage
-
Hallo, ich habe mal wieder eine Frage. Beim Verschlüsseln füge ich an den Anfang des Streams den Hash der Datei hinzu:
using (CryptoStream crypto = new CryptoStream(outputStream, rijndael.CreateEncryptor(), CryptoStreamMode.Write)) { crypto.Write(padding, 0, 1); crypto.Write(MAC, 0, MAC.Length); //Read 1024 bytes to the buffer until all bytes are read do { //Read in bytes bytesRead = inputStream.Read(buffer, 0, bufferSize); //Write bytes to CryptoStream crypto.Write(buffer, 0, bytesRead); } while (bytesRead != 0); }
Beim Entschlüsseln möchte ich diesen Hash wieder auslesen, allerdings nicht in den Ausgabestream hineinschreiben. Hier tritt das Problem auf. Wenn ich es so wie im angehängten Code mache, so taucht eine merkwürdige Zeichenfolge am Ende der Datei auf, die, wenn ich den Hash mit in die Datei schreibe, nicht auftaucht.
using (CryptoStream crypto = new CryptoStream(outputStream, rijndael.CreateDecryptor(), CryptoStreamMode.Write)) { byte[] paddingB = new byte[1]; int length = inputStream.Read(paddingB, 0, 1); crypto.Write(paddingB, 0, 1); byte[] storedMAC = new byte[MACLength / 8]; int readMACLength = inputStream.Read(storedMAC, 0, storedMAC.Length); crypto.Write(storedMAC, 0, storedMAC.Length); do { //Read in maximal 1024 byte from the cryptostream bytesRead = inputStream.Read(buffer, 0, bufferSize); //Write the decrypted bytes to the output stream crypto.Write(buffer, 0, bytesRead); } while (bytesRead != 0); }
Kann mir hier jemand weiterhelfen?
Antworten
-
Hae? Warum kopieren? Implementier einfach deinen eigenen Stream. Wenn deine MAC am Anfang steht, dann überschreib die Seek-Operationen so, das eine Seek(fromBeginning, 0) halt an den echten Beginn gesetzt wird.
- Als Antwort markiert Simon Rühle Sonntag, 17. März 2013 17:48
Alle Antworten
-
Also wenn ich das richtig verstehe, soll ich erst dem Eingabestream die Daten hinzufügen, und dann diesen Verschlüsseln. Beim Entschlüsseln muss ich dann den ganzen Stream entschlüsseln und dann die Daten auslesen? Aber wie entferne ich diese aus dem entschlüsselten Stream? Dazu muss ich doch den Rest des Streams in einen neuen packen und dies kann doch bei großen Streams (z.B. 5GB Datei) recht lange brauchen. Wie kann ich das lösen?
-
Der/die MAC (Message authentication code) dient zur Verifzierung der Nachricht. Was du als Nachricht betrachtest bleibt dir überlassen. Die Reihenfolge ist gleich, auch wenn es hier folgende Überlegungen (Should we MAC-then-encrypt or encrypt-then-MAC?) zu gibt. Und deine Methode sollten folgende Signatur haben:
Stream Decrypt(Stream in) {} Stream Dehash(Stream in) {} Stream Encrypt(Stream in) {} Stream Hash(Stream in) {}
Bezüglich der Performance in deinem Falle: Da stellt sich die Frage, ob es nicht geschickter wäre, die MAC ans Ende des Streams zu setzen.
-
Hae? Warum kopieren? Implementier einfach deinen eigenen Stream. Wenn deine MAC am Anfang steht, dann überschreib die Seek-Operationen so, das eine Seek(fromBeginning, 0) halt an den echten Beginn gesetzt wird.
- Als Antwort markiert Simon Rühle Sonntag, 17. März 2013 17:48