【问题标题】:How to SFTP a Stream using PGP Encryption如何使用 PGP 加密 SFTP 流
【发布时间】:2021-06-18 12:24:52
【问题描述】:

我正在使用 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:\Repos\Solution\Project.Web\Areas\Pims\Controllers\Eod\EodController.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);
    }
}

【问题讨论】:

  • @MartinPrikryl 我已编辑以包含异常堆栈跟踪。
  • 上传文件夹确实存在,这在我列出目录并循环浏览文件时得到确认。此代码实际上创建了文件test.txt.pgp,但其中没有数据,pgp.EncryptStream 出现错误
  • 是的,上传成功。我现在已经设法使用clinet.OpenWrite 上传了加密文件(如上面的编辑所示)。

标签: c# sftp pgp ssh.net


【解决方案1】:

您可以将文件加密到本地电脑,然后您可以将文件上传到远程服务器

   string path= "c:\yourfolder\test.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()

       
    }

【讨论】:

  • 感谢您的回答。我试图避免将文件保存到本地驱动器,而是纯粹在内存中创建一个文件,然后加密并发送到服务器。你知道怎么做吗?
  • 请分享代码 pgp.EncryptStream() 方法,或者您可以修改它以返回加密流而不是将其写入文件。然后你可以在uploadFile()中使用流
  • pgp.EncryptStream 是我用来加密数据的 PgpCore (github.com/mattosaurus/PgpCore#encryptstream) 的一种方法
  • 你能分享我的pgpcore dll吗??
猜你喜欢
  • 2012-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多