2013-05-23 4 views
0

Я зашифровал файл и написал зашифрованный контент в тот же файл. Но когда я дешифрую файл и пытаюсь записать его на то же, я не могу очистить старый контент, т. Е. Зашифрованный текст. Как я мог это сделать.Расшифровать файл и записать его в файл C#

шифрованной код

static void EncryptFile(string sInputFilename,string sKey) 
    { 
     FileStream fsInput = new FileStream(sInputFilename, 
      FileMode.Open, 
      FileAccess.ReadWrite); 

     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
     ICryptoTransform desencrypt = DES.CreateEncryptor(); 
     CryptoStream cryptostream = new CryptoStream(fsInput, 
      desencrypt, 
      CryptoStreamMode.Write); 

     byte[] bytearrayinput = new byte[fsInput.Length]; 
     fsInput.Read(bytearrayinput, 0, bytearrayinput.Length); 
     fsInput.SetLength(0); 
     cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); 
     cryptostream.Close(); 
     fsInput.Close(); 
    } 

Дешифровка Код

static void DecryptFile(string sInputFilename, 
    string sKey) 
    { 
     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey); 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey); 
     FileStream fsread = new FileStream(sInputFilename, 
      FileMode.Open, 
      FileAccess.ReadWrite); 

     ICryptoTransform desdecrypt = DES.CreateDecryptor(); 

     CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
      desdecrypt, 
      CryptoStreamMode.Read); 
     int data; 

     while ((data = cryptostreamDecr.ReadByte()) != -1) 
     { 
      fsread.WriteByte((byte)data); 
     } 

     fsread.Close(); 
     cryptostreamDecr.Close(); 
    } 
+0

Что такое заброшенное исключение? – dasheddot

+0

Я добавил fsread.SetLength (0), чтобы очистить содержимое и написать его, дайте мне ошибку. Необработанное исключение типа «System.Security.Cryptography.CryptographicException» произошло в mscorlib.dll. Дополнительная информация: Плохие данные. – json

+2

Запишите расшифрованный файл на новое имя, удалите зашифрованный файл, переименуйте дешифрованный файл, чтобы исправить имя. (???) – lcryder

ответ

0

Вы пытаетесь записать зашифрованный файл на месте, пока вы дешифрования его, так что вы в конечном итоге добавив дополнительные расшифрованные данные в конец, прежде чем вы его прочитаете.

Предполагая по какой-то причине, что вы не можете просто пойти с предложением lcryder, если вам действительно нужно записать данные обратно в тот же файл, в конце вы можете расшифровать его в памяти и записать его после завершения:

private static void DecryptFile(string sInputFilename, 
    string sKey) 
{ 
    var DES = new DESCryptoServiceProvider(); 
    DES.Key = Encoding.ASCII.GetBytes(sKey); 
    DES.IV = Encoding.ASCII.GetBytes(sKey); 
    ICryptoTransform desdecrypt = DES.CreateDecryptor(); 

    using(var fsread = new FileStream(sInputFilename, 
     FileMode.Open, 
     FileAccess.ReadWrite)) 
    { 
     using(var cryptostreamDecr = new CryptoStream(fsread, 
      desdecrypt, 
      CryptoStreamMode.Read)) 
     { 
      int data; 

      fsread.Flush(); 

      using(var ms = new MemoryStream()) 
      { 
       while((data = cryptostreamDecr.ReadByte()) != -1) 
       { 
        ms.WriteByte((byte) data); 
       } 

       cryptostreamDecr.Close(); 

       using(var fsWrite = new FileStream(sInputFilename, FileMode.Truncate)) 
       { 
        ms.WriteTo(fsWrite); 
        ms.Flush(); 
       } 
      } 
     } 
    } 
} 

поток памяти хранит расшифрованные данные, пока вы закрыть поток чтения файла и открыть новый для записи (с FileMode.Truncate поэтому исходное содержимое уничтожается).

+0

Большое спасибо Hart. Способ, которым я шифруюсь, является прекрасным rt? Нужны ли какие-либо изменения в этом. – json

+0

Я не знаю достаточно, чтобы рассказать вам, следуете ли вы за всеми лучшими практиками для этого, но я предполагаю, что использование ключа для ключа и IV неверно. Кроме того, я уверен, что есть более эффективный способ, чем чтение потока 1 байт за раз. –

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