2013-05-23 5 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)를 추가하여 내용을 지우고 오류가 발생했습니다. mscorlib.dll에서 'System.Security.Cryptography.CryptographicException'유형의 처리되지 않은 예외가 발생했습니다. 추가 정보 : 잘못된 데이터. – json

+2

해독 된 파일을 새 이름으로 쓰고, 암호화 된 파일을 삭제하고, 해독 된 파일의 이름을 올바른 이름으로 바꿉니다. (???) – lcryder

답변

0

당신에게 여분의 암호화되지 않은 데이터를 추가 결국, 그래서 당신은 당신이 그것을 해독하는 동안 자리에 암호화 된 파일에 쓰기를 시도하고 네가 그것을 끝내기 전에 끝.

어떤 이유로 lcryder의 제안으로 갈 수 없다고 가정 할 때 마지막에 같은 파일에 데이터를 다시 써야하는 경우 메모리에서 해독하고 완료되면 쓸 수 있습니다. 당신이 파일을 읽는 스트림을 닫고 (원래 내용이 파괴되도록 FileMode.Truncate으로) 작성하기위한 새로운 하나를 열 때

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

메모리 스트림은 암호화되지 않은 데이터를 보유하고 있습니다.

+0

감사합니다. 하트. 내가 암호화하는 방법은 괜찮 았어? 그 부분을 수정해야합니까? – json

+0

나는이 모든 모범 사례를 따르고 있는지에 대해 충분히 알지 못하지만 키와 IV 모두에 대해 키를 사용하는 것이 잘못되었다고 생각합니다. 또한 한 번에 1 바이트 씩 스트림을 읽는 것보다 더 효율적인 방법이 있다고 확신합니다. –