使用Process类从c#网站进行GPG解密不起作用

使用Process类从c#网站进行GPG解密不起作用,c#,encryption,process,gnupg,pgp,C#,Encryption,Process,Gnupg,Pgp,我正在尝试使用Process类在C#asp.net网站中使用GnuPG对pgp加密文件进行解密。我可以使用Process类在网站中成功地导入和加密GPG命令。当我运行--decrypt时,文件不会被解密,StandardError输出如下所示: gpg:使用2048位RSA密钥加密,ID AAAAA,创建于2019-12-06“A公司” gpg:解密失败:没有密钥 我确实有我在代码中使用的正确密钥。但是此网页找不到密钥。我已经通过在网站上执行--list secret keys GPG命令确认了

我正在尝试使用Process类在C#asp.net网站中使用GnuPG对pgp加密文件进行解密。我可以使用Process类在网站中成功地导入和加密GPG命令。当我运行--decrypt时,文件不会被解密,StandardError输出如下所示:

gpg:使用2048位RSA密钥加密,ID AAAAA,创建于2019-12-06“A公司” gpg:解密失败:没有密钥

我确实有我在代码中使用的正确密钥。但是此网页找不到密钥。我已经通过在网站上执行--list secret keys GPG命令确认了这一点。它没有列出任何东西。网站中的--list keys cmd确实列出了公钥

我可以在相同的web服务器上从Windows cmd提示符运行相同的GPG DECRIPT cmd,并且使用相同的密码短语进行解密。这是DOS命令和输出:

C:\path>gpg--batch--trust model always--pinentry模式环回--passphrase“passphrase”--输出“D:\Websites\test.txt”--解密“D:\Websites\test.pgp”

gpg:使用2048位RSA密钥加密,ID AAAAA,创建于2019-12-06“A公司”

这是我的aspx和aspx.cs解密代码:

<%@ Page Title="" Language="C#" Debug="true" AutoEventWireup="true" CodeFile="td.aspx.cs" Inherits="TestDecrypt" %>

using System;
using System.Web.UI;
using System.Diagnostics;

public partial class TestDecrypt : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            string inFile = "D:\\Websites\\test.res.pgp";
            string outFile = inFile.Replace(".res.pgp", "res.txt");
            DecryptFile(inFile, outFile);
        }
        catch (Exception ex)
        {
            Response.Write("ex.Message=" + ex.Message);
        }
    }

    private void DecryptFile(string inputName, string outputName)
    {
        const string commandFormat = @"--passphrase --batch --trust-model always --pinentry-mode loopback --output {0} --decrypt {1}";
        PgpCmd(string.Format(commandFormat, outputName, inputName), "PassPhrase");
    }

    public void PgpCmd(string command, string password)
    {
        string path = string.Format(@"{0}\gpg.exe", @"C:\Program Files (x86)\GnuPG\bin");

        var procStartInfo = new ProcessStartInfo(path, command)
        {
            CreateNoWindow = true,
            UseShellExecute = false,
            RedirectStandardError = true
        };

        var proc = new Process { StartInfo = procStartInfo };
        proc.Start();

        while (!proc.StandardError.EndOfStream)
        {
            string line = proc.StandardError.ReadLine();
            Response.Write("<br>proc line:" + line);
        }

        proc.WaitForExit();
    }
}

使用制度;
使用System.Web.UI;
使用系统诊断;
公共部分类TestDecrypt:第页
{
受保护的无效页面加载(对象发送方、事件参数e)
{
尝试
{
字符串infle=“D:\\Websites\\test.res.pgp”;
字符串输出文件=infle.Replace(“.res.pgp”、“res.txt”);
解密文件(填充、输出文件);
}
捕获(例外情况除外)
{
响应。写入(“ex.Message=“+ex.Message”);
}
}
私有无效解密文件(字符串inputName、字符串outputName)
{
const string commandFormat=@--passphrase--batch--trust model always--pinentry模式环回--output{0}--decrypt{1}”;
PgpCmd(string.Format(commandFormat,outputName,inputName),“密码短语”);
}
public void PgpCmd(字符串命令、字符串密码)
{
字符串路径=string.Format(@“{0}\gpg.exe”,“C:\ProgramFiles(x86)\GnuPG\bin”);
var procStartInfo=newprocessstartinfo(路径,命令)
{
CreateNoWindow=true,
UseShellExecute=false,
重定向标准错误=true
};
var proc=新进程{StartInfo=procStartInfo};
proc.Start();
而(!proc.StandardError.EndOfStream)
{
string line=proc.StandardError.ReadLine();
响应。写入(“
过程行:”+行); } 进程WaitForExit(); } }
这是我的aspx和aspx.cs列表键代码:

<%@ Page Title="" Language="C#" Debug="true" AutoEventWireup="true" CodeFile="td2.aspx.cs" Inherits="TestDecrypt2" %>

using System;
using System.Web.UI;
using System.Diagnostics;

public partial class TestDecrypt2 : Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            ListKeys();
        }
        catch (Exception ex)
        {
            Response.Write("ex.Message=" + ex.Message);
        }
    }

    private void ListKeys()
    {
        Response.Write("<br />all keys:");
        string cmd = @"--list-keys";
        PgpCmd(cmd);

        Response.Write("<br /><br />secret keys:");
        cmd = @"--list-secret-keys";
        PgpCmd(cmd);
    }

    public void PgpCmd(string command)
    {
        string path = string.Format(@"{0}\gpg.exe", @"C:\Program Files (x86)\GnuPG\bin");

        var procStartInfo = new ProcessStartInfo(path, command)
        {
            CreateNoWindow = true,
            UseShellExecute = false,
            RedirectStandardOutput = true
        };

        var proc = new Process { StartInfo = procStartInfo };
        proc.Start();

        while (!proc.StandardOutput.EndOfStream)
        {
            string line = proc.StandardOutput.ReadLine();
            Response.Write("<br>proc line:" + line);
        }

        proc.WaitForExit();
    }
}

使用制度;
使用System.Web.UI;
使用系统诊断;
公共部分类TestDecrypt2:第页
{
受保护的无效页面加载(对象发送方、事件参数e)
{
尝试
{
ListKeys();
}
捕获(例外情况除外)
{
响应。写入(“ex.Message=“+ex.Message”);
}
}
私有无效列表键()
{
响应。写入(“
所有键:”); 字符串cmd=@“--列出键”; PgpCmd(cmd); 写(“

密钥:”); cmd=@“--列出密钥”; PgpCmd(cmd); } 公共无效PgpCmd(字符串命令) { 字符串路径=string.Format(@“{0}\gpg.exe”,“C:\ProgramFiles(x86)\GnuPG\bin”); var procStartInfo=newprocessstartinfo(路径,命令) { CreateNoWindow=true, UseShellExecute=false, 重定向标准输出=真 }; var proc=新进程{StartInfo=procStartInfo}; proc.Start(); 而(!proc.StandardOutput.EndOfStream) { string line=proc.StandardOutput.ReadLine(); 响应。写入(“
过程行:”+行); } 进程WaitForExit(); } }
有人知道为什么网页不能访问密钥,但是DOS cmd可以


谢谢你的帮助

我发现了这个问题。我的网站与我使用远程桌面连接登录web服务器时的用户不同,它在与我的RDC用户(用于安装和创建Gnupg文件)不同的位置查找私钥。我尝试使用GPG--homedir来设置位置,但运气不佳。最后,我只是将所需的文件(包括私钥文件)复制到网站用户使用的目录位置,并修复了它。我在网站上做了一个GPG-h,以找到网站正在寻找私钥的文件夹位置。无需更改编码。这篇文章终于帮我找到了解决办法

这不是你的代码。它不会编译。请发布您真正使用且可编译的代码。为什么要通过
cmd
运行
gpg
,而不是直接运行
gpg
?听起来像是一个不必要的层面。你注意到你没有做同样的事情吗?如果出现C#错误:文件由公司A加密。如果出现Windows提示:文件由公司B加密。是的,我在C#和dos中发出相同的GPG cmd。我知道输出的顺序不同,不知道为什么。这两种方法都试图解密同一个文件。这正是我使用的代码片段,而不是整个程序,因此不可编译。出于安全原因,引号内的值已从实际值更改,但我正在执行相同的GPG命令。