2016-07-06 20 views
0

Ich komprimiere und verschlüssle eine Datei. Kein Problem damit. Probleme treten auf, wenn ich versuche, die Datei zu entschlüsseln, und schließlich versuche ich, die entschlüsselte Datei zu dekomprimieren. In diesem Moment, erhalte ich eine Ausnahme in ReadEndOfCentralDirectory: (Aktualisiert)Die Datei konnte nach der Entschlüsselung nicht dekomprimiert werden.

Offset to Central Directory cannot be held in an Int64. 
en System.IO.Compression.ZipArchive.ReadEndOfCentralDirectory() 
en System.IO.Compression.ZipArchive.Init(Stream stream, ZipArchiveMode mode, Boolean leaveOpen) 
en System.IO.Compression.ZipArchive..ctor(Stream stream, ZipArchiveMode mode, Boolean leaveOpen, Encoding entryNameEncoding) 
en System.IO.Compression.ZipFile.Open(String archiveFileName, ZipArchiveMode mode, Encoding entryNameEncoding) 
en System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName, Encoding entryNameEncoding) 
en System.IO.Compression.ZipFile.ExtractToDirectory(String sourceArchiveFileName, String destinationDirectoryName)` 

Für den Ordner zip dieses Ich verwende

ZipFile.CreateFromDirectory(sourcePath, pathZipFile, CompressionLevel.Fastest, false); 

Für encrypt:

  RijndaelManaged key = new RijndaelManaged(); 

      key.KeySize = 256; 
      key.BlockSize = 256; 
      key.Padding = System.Security.Cryptography.PaddingMode.ISO10126; 
      key.Key = Convert.FromBase64String(aes); 
      key.IV = Convert.FromBase64String(aes); 

      ICryptoTransform encryptor = key.CreateEncryptor(); 
      using (FileStream InputFile = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)) 
      using (FileStream OutputFile = new FileStream(targetPath, FileMode.Create, FileAccess.Write)) 
      { 
       using (CryptoStream csEncrypt = new CryptoStream(OutputFile, encryptor, CryptoStreamMode.Write)) 
       { 

        long total = InputFile.Length; 
        var buffer = new byte[total]; 
        var read = InputFile.Read(buffer, 0, buffer.Length); 
        csEncrypt.Write(buffer, 0, read); 
       } 
      } 

Für decrypt:

  RijndaelManaged key = new RijndaelManaged(); 

      key.KeySize = 256; 
      key.BlockSize = 256; 
      key.Padding = System.Security.Cryptography.PaddingMode.ISO10126; 
      key.Key = Convert.FromBase64String(aes); 
      key.IV = Convert.FromBase64String(aes); 
      ICryptoTransform cryptor = key.CreateDecryptor(); 
      using (FileStream InputFile = new FileStream(sourcePath, FileMode.Open, FileAccess.Read)) 
      { 
       CryptoStream csEncrypt = new CryptoStream(InputFile, cryptor, CryptoStreamMode.Read); 
       StreamWriter fsDecrypted = new StreamWriter(targetPath); 
       fsDecrypted.Write(new StreamReader(csEncrypt).ReadToEnd()); 
       fsDecrypted.Close(); 
      } 

Für unzip:

ZipFile.ExtractToDirectory(zipPath, extractPath); 

Wenn ich den ganzen Prozess und vor allem mir Datei verschlüsseln ändern, dann komprimiert, kann ich es dekomprimieren und es schließlich ohne Probleme entschlüsseln. Könnte das Problem in der Verschlüsselungs-/Entschlüsselungsphase sein (möglicherweise im Zusammenhang mit Kodierung, Bytes oder ähnlichem ...)? Danke im Voraus.

+0

* Was * Ausnahme? –

+0

Aktualisiert, @OndrejTucny – AdSsa

Antwort

1

StreamWriter Sie schreiben Text. Sie sollten Bytes schreiben. Die Konvertierung ist nicht verlustfrei. Verwenden Sie FileStream.

+0

Vielen Dank, @ usr, mit genau dem gleichen Code, der im Verschlüsselungsteil die Lösung war ... – AdSsa