2012-04-21 3 views
1

VS 2010 (C#)을 사용하고 있습니다. 파일을 FTP 사이트에서 업로드 (다운로드) 할 때 파일을 암호화 (암호 해독)하려고합니다. 로컬의 임시 파일을 사용하여 다운로드하기 전에 암호화하고 다운로드 한 후에 해독하는 것이 더 빠를 것이라고 생각했습니다. 아래 코드에서 오류가 발생합니다. 여러 스트림 유형 (즉, FileStream, CryptoStream 및 Stream)을 정렬 할 수없는 것 같습니다. 어떤 도움이라도 대단히 감사합니다.FTP 사이트에 게시 된 파일 암호화

public void Upload(byte[] desKey, byte[] desIV) 
    { 
     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Destination); 
     request.Method = WebRequestMethods.Ftp.UploadFile; 

     request.Credentials = new NetworkCredential(UserName, Password); 

     FileStream fStream = File.Open(SourceFile, FileMode.OpenOrCreate); 

     CryptoStream responseStream = new CryptoStream(fStream, new DESCryptoServiceProvider().CreateDecryptor(desKey, desIV), CryptoStreamMode.Read); 

     byte[] fileContents = Encoding.UTF8.GetBytes(responseStream.ToString()); 

     responseStream.Close(); ///ERROR here 
     request.ContentLength = fileContents.Length; 

     Stream requestStream = request.GetRequestStream(); 
     requestStream.Write(fileContents, 0, fileContents.Length); 
     requestStream.Close(); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     response.Close(); 
    } 

단위 테스트 :이 나를 위해 일

public void CleanEncryptUploadTest() 
    {   
     FT.ftp uploadTest = new FT.ftp(); 

     uploadTest.UserName = "ausername"; 
     uploadTest.Password = "apassword"; 
     uploadTest.SourceFile = "D:\\Temp\\Test\\file.txt"; 
     uploadTest.Destination = "ftp://ftp.mysite.com/test2.txt"; 

     byte[] key = ASCIIEncoding.ASCII.GetBytes("TestZone"); 
     byte[] initVector = ASCIIEncoding.ASCII.GetBytes("TestZone"); 

     uploadTest.Upload(key, initVector); 
    } 
+3

무엇이 오류입니까? – CharlesB

+0

무엇이 당신이 이것을 더 빨리 할 수 ​​있었습니까? –

+0

은 대용량 파일을 메모리에 저장 한 다음 웹 사이트에 직접 쓰는 것이 원본 파일을 읽는 것, 로컬 컴퓨터에서 암호화 된 복사본을 만들고 마지막으로 암호화 된 파일을 업로드하는 것보다 빠릅니다. 내가 틀렸을 수도있다. –

답변

0

, 나는 메모리 스트림을 사용하는 대신에 암호화 된 바이트를 썼다. 또한 cryptostream 모드를 쓰기로 변경했습니다.

public void Upload(byte[] key, byte[] iv) 
    { 
     byte[] fileContents; 

     using (FileStream inputeFile = new FileStream(this.SourceFile, FileMode.Open, FileAccess.Read)) 
     { 
      using (MemoryStream encryptedStream = new MemoryStream()) 
      { 
       using (CryptoStream cryptostream = new CryptoStream(encryptedStream, new DESCryptoServiceProvider().CreateEncryptor(key, iv), CryptoStreamMode.Write)) 
       { 
        byte[] bytearrayinput = new byte[inputeFile.Length]; 
        inputeFile.Read(bytearrayinput, 0, bytearrayinput.Length); 
        cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length); 
        fileContents = encryptedStream.ToArray(); 
       } 
      } 
     } 

     FtpWebRequest request = (FtpWebRequest)WebRequest.Create(this.Destination); 
     request.Method = WebRequestMethods.Ftp.UploadFile; 
     request.Credentials = new NetworkCredential(this.UserName, this.Password); 
     request.ContentLength = fileContents.Length; 

     Stream requestStream = request.GetRequestStream(); 
     requestStream.Write(fileContents, 0, fileContents.Length); 
     requestStream.Close(); 

     FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 
     response.Close(); 
    } 
관련 문제