Расшифровка GPG не работает с c# Сайт использует класс Process - PullRequest
0 голосов
/ 19 февраля 2020

Я пытаюсь расшифровать зашифрованный 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?

Спасибо за любую помощь

1 Ответ

0 голосов
/ 25 февраля 2020

Я нашел проблему. Мой веб-сайт, будучи другим пользователем, чем при входе на веб-сервер с подключением к удаленному рабочему столу, искал закрытый ключ в другом месте, чем мой пользователь RD C, который использовался для установки и создания файлов Gnupg. Я попытался использовать GPG --homedir, чтобы установить местоположение без удачи. Наконец, я просто скопировал необходимые файлы, включая файл с закрытым ключом, в каталог, используемый пользователем веб-сайта, и это было исправлено. Я сделал GPG -h с сайта, чтобы найти папку, в которой сайт искал закрытый ключ. Никаких изменений кодирования не требуется. Привет на этот пост, который, наконец, помог мне найти решение. GnuPG + Webservice + ASP. NET

...