1

VS 2010 (C#) を使用しています。FTP サイトからアップロード (ダウンロード) されているファイルを暗号化 (復号化) しようとしています。これは、ローカルの一時ファイルを使用してアップロード前に暗号化し、ダウンロード後に復号化するよりも速いと思いました。以下のコードでエラーが発生します。さまざまなストリームの種類 (つまり、FileStream、CryptoStream、および Stream) を揃えることができないようです。どんな助けでも大歓迎です。

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

1 に答える 1

0

これは私にとってはうまくいきました。メモリストリームを使用し、代わりに暗号化されたバイトを書き込みました。また、暗号ストリーム モードを書き込みに変更しました。

    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();
    }
于 2012-10-27T12:05:03.963 に答える