这篇文章类似于早先关于使用C#将这些文件传输到FTP服务器时防止PGP二进制文件损坏的帖子(http://stackoverflow.com/questions/7353993/ftp-changing-pgp-file-虽然我问了一个不同的问题,但是在转移过程中,这是一个不同的问题。
要点:
我通过对所有PGP加密文件进行文本装配修复了PGP文件损坏的来源;但是,在实现此修复程序之前,我有一堆PGP二进制文件已加密并上传到我的FTP服务器。知道用于将文件上传到FTP服务器的代码和用于管理FTP服务器的软件,是否可以修复损坏的PGP二进制文件以便解密和恢复?
详细说明: 1)我有使用Gpg4Win加密的PGP加密文件,这些文件不是文本装甲(它们是二进制文件),它们是使用VB .NET代码(包含在下面)从IIS 6.0 Web服务器上传到CoreFTP服务器的。
2)我没有这些文件的未加密副本。在上传到CoreFTP服务器之前,它们在Web服务器的内存中加密。因此,我需要解密二进制PGP文件,否则文件中的数据将丢失。
3)PGP文件中的二进制文件已损坏,即使我有正确的PGP私钥,我也无法解密Gpg4Win中的文件。 Gpg4Win无法在加密的二进制文件中查找/读取PGP数据。
4)在上传到CoreFTP服务器之前,我能够成功解密更新的文本装甲PGP加密文件(二进制数据以base64表示法存储)。因此,解密问题很可能是由于文件损坏而不是Gpg4Win或我的PGP私钥/公钥对的任何问题。
5)我试图在PGP二进制文件上使用的几个二进制文件恢复程序说它们找不到文件数据并且无法修复二进制文件损坏。或者,他们不会对PGP二进制文件中包含的二进制数据进行任何更改。
用于上传PGP二进制文件的VB .net代码:
Public Function UploadFile(ByVal localFileName As String, ByVal FTPFilename As String, ByVal UseBinary As Boolean, ByVal uniqueName As Boolean, ByRef StatusDescription As String) As FtpStatusCode
Dim request As FtpWebRequest = CType(FtpWebRequest.Create(FTPFilename), FtpWebRequest)
request.Credentials = New NetworkCredential(Username, Password)
If uniqueName Then
request.Method = WebRequestMethods.Ftp.UploadFileWithUniqueName
Else
request.Method = WebRequestMethods.Ftp.UploadFile
End If
request.UseBinary = UseBinary
Dim ff As New FileInfo(localFileName)
Dim fileContents(Convert.ToInt32(ff.Length)) As Byte
Using fr As FileStream = ff.OpenRead
fr.Read(fileContents, 0, fileContents.Length)
End Using
Using writer As Stream = request.GetRequestStream
writer.Write(fileContents, 0, fileContents.Length)
End Using
Dim response As FtpWebResponse = CType(request.GetResponse, FtpWebResponse)
StatusDescription = response.StatusDescription
Return response.StatusCode
End Function
对于我的FTP服务器,我使用的是最新版本的CoreFTP for Windows。
当响应FTP LIST命令时,CoreFTP以Unix格式(而不是MS-DOS格式)返回文件信息,所以我想知道二进制损坏是否是从Windows服务器传输二进制文件的结果使用MS-DOS格式化二进制文件到使用Unix格式的FTP服务器。但是,打开/读取从我的Web服务器上传到CoreFTP服务器的非PGP二进制文件时,我没有遇到任何问题。
谢谢! 艾萨克
答案 0 :(得分:0)
看起来你的二进制文件是以文本模式传输的,它可以翻译行结尾和其他非ascii字符。 而且,腐败最有可能是不可逆转的。