2012-04-27 3 views
1

У меня есть странная проблема при попытке расшифровать зашифрованный текстовый файл. В основном содержимое файла .txt - это «это тест :)», когда дешифрование вывода «это тест:», укажите отсутствующий «)».MemoryStream и расшифровка текстового файла

Это не тот случай, когда я дешифрую файл байтом за один раз (while loop), но при использовании приведенного ниже кода кажется, что проблема выше.

private static void DecryptFile(string inputFile, string outputFile, string skey) 
     { 
      RijndaelManaged aes = new RijndaelManaged(); 

      try 
      { 
       byte[] key = ASCIIEncoding.UTF8.GetBytes(skey); 
       byte[] file = File.ReadAllBytes(inputFile); 

       using (MemoryStream ms = new MemoryStream()) 
       { 
         using (CryptoStream cs = new CryptoStream(ms, aes.CreateDecryptor(key, key), CryptoStreamMode.Write)) 
         { 
          cs.Write(file, 0, file.Length); 

          File.WriteAllBytes(outputFile, ms.ToArray()); 
          aes.Clear(); 
         } 
       } 

      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.Message); 
       aes.Clear(); 
      } 
     } 

Извините неряшливый код, это было просто для целей тестирования.

+1

Просьба также показать код шифрования. – phoog

ответ

3

Блок-шифр CryptoStream может только шифровать или расшифровывать содержимое в фиксированных размерах блоков. Вы не дали ему достаточно контента, чтобы заполнить последний блок, так что он ждет больше. Этот неполный неполный блок теряется.

Вам необходимо либо позвонить FlushFinalBlock на свой CryptoStream, либо выйти за пределы using, чтобы он автоматически закрывал его. Тогда ваш MemoryStream должен содержать отсутствующие символы.

Обратите внимание, что при расшифровке вашего вывода теперь будет округлено до полного блока, т. Е. Вы получите дополнительные нули, заполняющие конец ваших данных.

+0

вызов cs.FlushFinalBlock(); исправляет проблему, спасибо. – denied66

Смежные вопросы