2012-04-21 89 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 2012-04-21 08:54:41

+0

是什麼讓你覺得這會更快? – 2012-04-21 08:56:10

+0

認爲在大文件的內存中加密然後直接寫入網站比讀源文件更快,在本地機器上創建加密副本,最後上傳加密文件。我可能是錯的。 – 2012-04-21 09:07:29

回答

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