Я пытаюсь расшифровать зашифрованный pgp-файл с помощью GnuPG на веб-сайте C# asp. net с использованием класса Process. Я могу успешно импортировать и шифровать команды GPG на сайте, используя класс Process. Когда я запускаю --decrypt, файл не дешифруется, и вывод StandardError выглядит следующим образом:
gpg: зашифрован с помощью 2048-битного ключа RSA, идентификатор AAAAAAAAAAAAAAAA, создан 2019-12-06 «Компания A» gpg : расшифровка не удалась: Нет секретного ключа
У меня есть правильный секретный ключ, который я использую в коде. Но секретный ключ не найден этой веб-страницей. Я подтвердил это, выполнив на сайте команду GPL --list-secret-keys. Это ничего не перечисляет. Команда --list-keys на веб-сайте действительно перечисляет ключ publi c.
Я могу запустить тот же cmd GPG для расшифровки из приглашения Windows cmd, на том же веб-сервере и расшифровку работает с использованием той же парольной фразы. Это командный DOS и вывод:
C: \ path> gpg --batch --trust-модель всегда - loopback-mode loopback --passphrase "PassPhrase" --output "D: \ Websites \ test.txt "--decrypt" D: \ Websites \ test.pgp "
gpg: зашифрован с помощью 2048-битного ключа RSA, идентификатор AAAAAAAAAAAAAAAA, создан 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();
}
}
Это мой список ключей 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();
}
}
Кто-нибудь знает, почему в Интернете страница не может получить доступ к секретному ключу, но может DOS cmd?
Спасибо за любую помощь