如何使用PGP加密对流进行SFTP



我正在使用PgpCore和 SSH.NET 来加密流,并通过sftp在远程服务器上使用加密流创建文件。

我有以下尝试,但是,虽然我可以成功列出远程目录中的文件,但我无法写入远程文件。我在pgp.EncryptStream行得到错误no such file

using (var client = new SftpClient(server, 22, username, password))
{
client.Connect();
Console.WriteLine("Connected to client.");
var inputStream = new MemoryStream();
var fileContents = Encoding.UTF8.GetBytes(sb.ToString());
inputStream.Write(fileContents, 0, fileContents.Length);
inputStream.Position = 0;
var outputStream = new MemoryStream();
var files = client.ListDirectory("/upload/");
foreach (var file in files)
{
string remoteFileName = file.Name;
Console.WriteLine(remoteFileName);
}
foreach (var file in files)
{
string remoteFileName = file.FullName;
Console.WriteLine(remoteFileName);
}
using (PGP pgp = new PGP())
{
Console.WriteLine("Doing PGP...");
using (Stream outputFileStream = client.Create("/upload/test.txt.pgp"))
using (Stream publicKeyStream = new FileStream(@".PublicKey.asc", FileMode.Open))
{
Console.WriteLine("Encrypting Stream...");
pgp.EncryptStream(inputStream, outputFileStream, publicKeyStream);
Console.WriteLine("Stream Encrypted.");
//Console.WriteLine("Uploading File.");
//client.UploadFile(outputFileStream, string.Format("/upload/{0}", "test.txt.pgp"));
//Console.WriteLine("Upload Complete.");
}
}
}

关于我该如何做到这一点的任何想法?

异常堆栈跟踪:

at Renci.SshNet.Sftp.SftpSession.RequestWrite(Byte[] handle, UInt64 serverOffset, Byte[] data, Int32 offset, Int32 length, AutoResetEvent wait, Action`1 writeCompleted)
at Renci.SshNet.Sftp.SftpFileStream.FlushWriteBuffer()
at Renci.SshNet.Sftp.SftpFileStream.Dispose(Boolean disposing)
at System.IO.Stream.Close()
at Project.Web.Areas.Pims.Controllers.Eod.EodController.EncryptStream(String fileName, StringBuilder sb) in C:ReposSolutionProject.WebAreasPimsControllersEodEodController.cs:line 144

编辑: 对于那些可能觉得它有用的人,我设法使用client.OpenWrite而不是client.Create上传加密文件,如下所示。我还添加了代码以使用我的 pgp 私钥和密码对加密文件进行签名:

工作解决方案:

using (PGP pgp = new PGP())
{
using (Stream outputFileStream = client.OpenWrite("/upload/test.txt.pgp"))
using (Stream publicKeyStream = new FileStream(@".MSPublicKey.asc", FileMode.Open))
using (Stream privateKeyStream = new FileStream(@".PrivateKey.asc", FileMode.Open))
{
pgp.EncryptStreamAndSign(inputStream, outputFileStream, publicKeyStream, privateKeyStream, pgpPasspharse, true, true);
}
}

您可以将文件嵌入到本地 pc,然后可以将文件上传到远程服务器

string path= "c:yourfoldertest.txt.pgp";
using (Stream outputFileStream = client.Create(path))
using (Stream publicKeyStream = new FileStream(@".PublicKey.asc", FileMode.Open))
{
Console.WriteLine("Encrypting Stream...");
pgp.EncryptStream(inputStream, outputFileStream, publicKeyStream);
uploadfile(path, "/upload/test.txt.pgp");
Console.WriteLine("Stream Encrypted.");

}

以下方法可以将包含的文件上传到远程服务器

static void uploadFile(string sourcepath, string destination)
{
FileStream file = new FileStream(path, FileMode.Open, FileAccess.Read );
byte[] bytes= new byte[file.Length];
file.Read(bytes, 0, (int)file.Length);
MemoryStream stream = new MemoryStream(bytes);          
IAsyncResult result = client.BeginUploadFile(ms, destination); 
//you can also use client.UploadFile()

}

最新更新