使用Process类从c#网站进行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解密代码:使用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命令确认了
<%@ 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命令。