2016-07-04 18 views
0

Ich habe Code geschrieben, der Daten verschlüsselt und dann komprimiert, aber ich habe es schwer Code zu schreiben, der alles umgekehrt macht.Was ist das Gegenteil von diesem Verschlüsselungs- + Komprimierungscode in C#?

Ich bekomme verschiedene Fehler, egal wie ich den Code zusammensetze.

Meine Frage ist sehr einfach:

In welcher Reihenfolge die verschiedenen Teile des Codes verwendet werden soll?

Hier ist mein Beispielcode zum Verschlüsseln und Komprimieren:

MemoryStream mS = new MemoryStream(); 
CryptoStream cryptS = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write)); 
DeflateStream defS = new DeflateStream(cryptS, CompressionMode.Compress) 
BinaryWriter bW = new BinaryWriter(defS)) 

//bw.Write("write a string for example"); 

bW.Close(); 

nun in der Entschlüsselungsroutine sollte, die CryptoStream nach den DeflateStream verwendet wird richtig rückwärts, um die Verschlüsselungsroutine zu verfolgen? Oder sollte die DeflateStream nach der CryptoStream verwendet werden?

Wie das folgende Beispiel:

MemoryStream mS = new MemoryStream(); 
DeflateStream defS = new DeflateStream(ms, CompressionMode.Compress) 
CryptoStream cryptS = new CryptoStream(defS, des.CreateEncryptor(), CryptoStreamMode.Write)); 
BinaryWriter bW = new BinaryWriter(cryptS)) 

//bw.Write("write a string for example"); 

bW.Close(); 

Die Fehler, die ich variieren Unknown block type. Stream might be corrupted.-Bad data bin immer.

EDIT:

Hier meine Verschlüsselungs- und Entschlüsselungsroutinen sind. Ich bekomme den Fehler Unknown block type. Stream might be corrupted.

Encryption Routine:

using (MemoryStream mS = new MemoryStream()) 
      { 
       using (CryptoStream cryptS = new CryptoStream(mS, dES.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        using (DeflateStream defS = new DeflateStream(cryptS, CompressionMode.Compress)) 
        { 
         using (BinaryWriter bW = new BinaryWriter(defS)) 
         { 
          DateTime dT = new DateTime().Now; 
          bW.Write(dt.Ticks); 
         } 
        } 
       } 
      } 

Entschlüsselungs-Routine (davon ausgehen, dass mS mit den verschlüsselten Daten gefüllt ist):

using (MemoryStream mS = new MemoryStream()) 
      { 
       using (DeflateStream defS = new DeflateStream(mS, CompressionMode.Decompress)) 
       { 
        using (CryptoStream cryptS = new CryptoStream(defS, dES.CreateDecryptor(), CryptoStreamMode.Read)) 
        { 
         using (BinaryReader bR = new BinaryReader(cryptS)) 
         { 
          DateTime dT = new DateTime((long)bR.ReadInt64()); 
         } 
        } 
       } 
      } 

Ich erhalte den Fehler Failed to construct a huffman tree using the length array. The stream might be corrupted.

Was könnte der Fehler sein?

Antwort

1

Die Daten wurden komprimiert und dann verschlüsselt. Sie müssen sie also zuerst entschlüsseln und dann dekomprimieren. Also, ja - es ist umgekehrt ... aber was nicht sofort offensichtlich ist, ist, dass der Datenfluss auch umgekehrt ist, so dass die Reihenfolge, in der Sie die Ströme zusammenketten, gleich bleibt.

Es wäre auch hilfreich, wenn Sie Ihre Stream-Verwendungen in using Blöcke einpacken, um sicherzustellen, dass sie richtig gespült und geschlossen werden.

sollten Dieser Code funktioniert:

using (var des = new AesCryptoServiceProvider()) 
{ 
    byte[] result; 

    using (var ms = new MemoryStream()) 
    { 
     using (var encryptor = des.CreateEncryptor()) 
     using (var cryptS = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) 
     using (var defS = new DeflateStream(cryptS, CompressionMode.Compress)) 
     using (var bw = new BinaryWriter(defS)) 
     { 
      bw.Write("Hello, World."); 
     } 

     result = ms.ToArray(); 
    }    

    using (var ms = new MemoryStream(result))    
    using (var decryptor = des.CreateDecryptor()) 
    using (var cryptS2 = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) 
    using (var defS = new DeflateStream(cryptS2, CompressionMode.Decompress)) 
    using (var br = new BinaryReader(defS)) 
    { 
     var x = br.ReadString(); 
    } 
} 

this fiddle für eine Demo sehen.

+0

Vielen Dank. Bitte sehen Sie meine aktualisierte Frage. Ich habe ein Stück meines Codes hinzugefügt. – vaid

+0

@vaid vergleiche deinen Code mit meinem. Sie sind anders. Sie haben Ihre Streams beim Schreiben zum Lesen unterschiedlich verkettet. –

+0

hmmmm ... Könntest du bitte ein wenig ausarbeiten? – vaid