任何方式来PGP加密数据流,并将其直接保存到FTP,而不必保存在本地?

问题描述:

我必须通过sFTP以asc格式将PGP加密文件发送到FTP文件夹。有没有办法让PGP加密一个流(它是CSV格式的流)并将它推送到sFTP ,而不必将它保存在本地机器上。任何方式来PGP加密数据流,并将其直接保存到FTP,而不必保存在本地?

下面是我用PGP加密函数,它接受文件名作为PARAM:

Private Function PGPEncrypt(ByVal FileName As String) As Boolean 
     Dim errorHappened As Boolean = False 
     Dim encodedFileName As String = String.Format("{0}{1}", FileName, ".asc") 
     Dim pgpRecipient As String = System.Configuration.ConfigurationManager.AppSettings.Get("PgpRecipient") 
     Dim psi As System.Diagnostics.ProcessStartInfo 
     Dim ErrorResult As String = "" 
     Dim Result As String = "" 
     Try 
      psi = New ProcessStartInfo(System.Configuration.ConfigurationManager.AppSettings.Get("PgpPath")) 
      psi.CreateNoWindow = True 
      psi.UseShellExecute = False 
      psi.Arguments = String.Format(" --armor --yes --recipient ""{0}"" --output ""{1}"" --encrypt ""{2}""", _ 
              pgpRecipient, encodedFileName, FileName) 
      psi.RedirectStandardInput = True 
      psi.RedirectStandardOutput = True 
      psi.RedirectStandardError = True 
      ProcessPGP = System.Diagnostics.Process.Start(psi) 
      ProcessPGP.StandardInput.Write(m_Passphrase) 
      Result = ProcessPGP.StandardError.ReadToEnd() 
      ProcessPGP.WaitForExit() 
     Catch ex As Exception 
      errorHappened = True 
      Dim ReadError As New StringBuilder() 
      ReadError.Append(vbCrLf & "Error Detail:") 
      ReadError.Append(vbCrLf & ex.ToString()) 
      OurEventLog.WriteEntry(ReadError.ToString(), EventLogEntryType.Error) 
     End Try 
     Return errorHappened 
    End Function 

再次,主要要求是保存到本地PGP加密的文件,然后发送到FTP但PGP加密文件必须通过流创建。

任何想法?

UPDATE:

FTP代码:

ftp.ConnectMode = FTPConnectMode.PASV 
       ftp.RemoteHost = Csla.ConfigurationManager.AppSettings("FTPRemoteHost") 
       If _blnDiagnostics Then DiagnosticsManager.Publish("STREAM_TO_FTP: CONNECT TO FTP", DiagnosticsManager.EntryType.SuccessAudit) 
       ftp.Connect() 
       ftp.Login(strUser, strPassword) 
       ftp.TransferType = FTPTransferType.BINARY 'ASCII 
       ftp.Put(OUTBOUNDMESSAGE, pFilename) 

       ftp.Quit() 
       ftp = Nothing 

OUTBOUNDMESSAGE是System.IO.Stream。

+0

这看起来不像C#给我...? – 2013-03-01 17:07:41

您可以将-传递给--output,而不是将文件名作为命令行的选项,而直接将输出显示给控制台。您可以直接传输这些数据。然后

Arguments属性应该是这样的:

psi.Arguments = String.Format(" --armor --yes --recipient ""{0}"" --output - --encrypt ""{1}""", _ 
             pgpRecipient, FileName) 

在执行的过程中,ProcessPGP.StandardOutput应该得到你所需要的数据流。

+0

FTP组件怎么样?只需将此加密数据流发送到FTP并将其另存为asc? – Learner 2013-03-01 15:49:49

+0

由于您没有包含任何如何通过FTP发送数据的代码,所以我无法确定您会做什么。如果您必须通过FTP流式传输现有文件,则只需使用输出流即可。如果它是一个将文件作为参数的库,并且流本身就可以工作,那么您需要找到一个支持采用某种形式的“Stream”的FTP库。 – doctorless 2013-03-01 15:51:44

+0

为FTP添加了代码。我使用ftp.Put,它将流作为参数。那么,基本上你的意思是PGP将流加密并将其保存为ftp上的asc? – Learner 2013-03-01 15:58:39