none
Problem mit Streams bei der Ver/Entschlüsselung RRS feed

  • 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?
    Mittwoch, 20. Februar 2013 10:57

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
    Mittwoch, 20. Februar 2013 18:47

Alle Antworten

  • Trenne die beiden Funktionalitäten (SoC). Also Encrypt(Hash(clearTextStream)) und Dehash(Decrypt(cryptedStream)).


    Mittwoch, 20. Februar 2013 13:03
  • 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?
    Mittwoch, 20. Februar 2013 13:11
  • 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.

    Mittwoch, 20. Februar 2013 14:16
  • Ein Problem habe ich noch. Wie kann ich die MAC aus dem Stream löschen? Einen neuen Stream erstellen und alles bis auf den MAC hineinkopieren, scheint mir bei großen Dateien nicht wirklich machbar.
    Mittwoch, 20. Februar 2013 16:58
  • 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
    Mittwoch, 20. Februar 2013 18:47