Расшифровка строки GPG из командной строки

Я пытаюсь написать консольное приложение, которое будет расшифровывать подпись gpg по запросу. Все идет нормально, ЗА ИСКЛЮЧЕНИЕМ той части, где он запрашивает мой пароль GPG. Как вызвать gpg --decrypt из командной строки без диалога ввода пароля?

Вот мой код:

var startInfo = new ProcessStartInfo("gpg.exe");
startInfo.Arguments = "--decrypt"; //this is where I want to insert "--passphrase MyFakePassword"
startInfo.CreateNoWindow = true;
startInfo.UseShellExecute = false;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.WorkingDirectory = @"C:\Program Files (x86)\GNU\GnuPG";

var proc = Process.Start(startInfo);
var sCommandLine = stringData + "\n"+(char)26+"\n"; //stringData is the encrypted string
proc.StandardInput.WriteLine(sCommandLine); 
proc.StandardInput.Flush();
proc.StandardInput.Close();

var result = proc.StandardOutput.ReadToEnd();

Я пытался использовать --passphrase MyFakePassword, --passphrase-fd MyFakePassword и даже --passphrase-fd 0 с моим паролем в первой строке ввода. Я бы не хотел помещать свой пароль в текстовый файл на машине, на которой выполняется этот код, если это вообще возможно.

Заранее благодарю за любую помощь.


person BilldrBot    schedule 25.03.2013    source источник


Ответы (4)


Используйте параметры --batch --passphrase-fd вместе, например, gpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp

В вашем коде после proc.StandardInput.WriteLine(sCommandLine); добавьте это:

proc.StandardInput.WriteLine("your passphrase here");
proc.StandardInput.Flush();
person amol    schedule 02.06.2014

Я еще немного покопался. Несколько месяцев назад кто-то сообщил об этом как об ошибке на форумах Gpg4Win. Единственные решения на данный момент — откатиться с 2.1.0 на предыдущую версию (в моем случае это не вариант), отключить пароль для ключа или передать его из текста. Вот сообщение на форуме: http://wald.intevation.org/forum/forum.php?thread_id=1116&forum_id=21&group_id=11 Комментариев от команды разработчиков нет.

person BilldrBot    schedule 26.03.2013
comment
Спасибо за это! Потраченные на это дни. Загрузка ftp.gnupg.org/gcrypt/ binary/gnupg-w32cli-1.4.9.exe и его установка устранила проблему для меня - person Andy Long; 15.08.2013

Чтобы избежать диалогового пароля, попробуйте этот метод, я использую его, и он отлично работает, вы найдете более подробную информацию.

http://www.systemdeveloper.info/2013/11/decrypt-files-encrypted-with-gnupg-from.html

    public static string DecryptFile(string encryptedFilePath)
    {
        FileInfo info = new FileInfo(encryptedFilePath);
        string decryptedFileName = info.FullName.Substring(0, info.FullName.LastIndexOf('.')) + "Dec.TXT";
        string encryptedFileName = info.FullName;

        string password = System.Configuration.ConfigurationManager.AppSettings["passphrase"].ToString();

        System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo("cmd.exe");

        psi.CreateNoWindow = true;
        psi.UseShellExecute = false;
        psi.RedirectStandardInput = true;
        psi.RedirectStandardOutput = true;
        psi.RedirectStandardError = true;
        psi.WorkingDirectory = @System.Configuration.ConfigurationManager.AppSettings["WorkingDirectory"].ToString();

        System.Diagnostics.Process process = System.Diagnostics.Process.Start(psi);
        string sCommandLine = @"echo " + password + "|gpg.exe --passphrase-fd 0 --batch --verbose --yes --output " + decryptedFileName + @" --decrypt " + encryptedFileName;

        process.StandardInput.WriteLine(sCommandLine);
        process.StandardInput.Flush();
        process.StandardInput.Close();
        process.WaitForExit();
        //string result = process.StandardOutput.ReadToEnd();
        //string error = process.StandardError.ReadToEnd();
        process.Close();
        return decryptedFileName;
    }
person angelo    schedule 12.12.2013

Примечание. Это представляет угрозу безопасности!

В любом случае

парольную фразу при подписании или расшифровке, если вы не используете симметричное шифрование. Страница руководства документирует следующие параметры:


--строка парольной фразы

Используйте строку в качестве парольной фразы. Это можно использовать только в том случае, если указана только одна парольная фраза. Очевидно, что это очень сомнительная безопасность в многопользовательской системе. Не используйте эту опцию, если можете ее избежать.

--passphrase-fd n

Прочитайте парольную фразу из файлового дескриптора n. Из файлового дескриптора n будет прочитана только первая строка. Если вы используете 0 для парольной фразы, она будет прочитана со стандартного ввода. Это можно использовать только в том случае, если указана только одна парольная фраза.

--passphrase-file file

Считайте парольную фразу из файла file. Из файла file будет прочитана только первая строка. Это можно использовать только в том случае, если указана только одна парольная фраза. Очевидно, что парольная фраза, хранящаяся в файле, имеет сомнительную безопасность, если другие пользователи могут прочитать этот файл. Не используйте эту опцию, если можете ее избежать.

Официальная утилита командной строки pgp предлагает эту возможность с флагом -z:

pgp -esa $SOURCEFILE $RECIPIENTPUBLICKEY -u $SENDERPRIVATEKEY -z $PASSPHRASE

person internals-in    schedule 26.03.2013
comment
Это все верная информация, прямо из документации. Думаю, я должен был быть более ясным, потому что я прочитал документацию, но предписанное решение, --passphrase "MyFakePassword", не работает. Причину этого можно найти в моем ответе. - person BilldrBot; 26.03.2013