2016-07-06 13 views
0

Я сжимаю и затем шифрую файл. Не проблема с этим. Проблемы возникают, когда я пытаюсь расшифровать файл, и, наконец, я пытаюсь распаковать дешифрованный файл. В тот момент, я получаю исключение в ReadEndOfCentralDirectory: (Обновлено)Невозможно распаковать файл после его расшифровки

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)` 

Для заархивировать папку, я использую этот

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

Для шифрования:

  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); 
       } 
      } 

Для дешифрования

  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(); 
      } 

Для разархивирует:

ZipFile.ExtractToDirectory(zipPath, extractPath); 

Если изменить весь процесс и в первую очередь я зашифровать файл, а затем сжать его, я могу распаковать его и, наконец, расшифровать его без проблем. Может быть проблема на фазе шифрования/дешифрования (возможно, связана с кодировкой, байтами или аналогичными ...)? Заранее спасибо.

+0

* Что * исключение? –

+0

Обновлено, @OndrejTucny – AdSsa

ответ

1

StreamWriter Вы пишете текст. Вы должны написать байты. Преобразование не является без потерь. Используйте FileStream.

+0

Спасибо большое, @usr, используя точно такой же код, что и в части шифрования, было решение ... – AdSsa