从命令行解密GPG字符串

时间:2013-03-25 21:09:36

标签: c# gnupg

我正在尝试编写一个控制台应用程序,它将根据请求解密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和我的密码。如果可能的话,我想避免将我的密码放在运行此代码的机器上的txt文件中。

提前感谢您的帮助。

4 个答案:

答案 0 :(得分:3)

同时使用--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();

答案 1 :(得分:2)

我做了一点挖掘。几个月前,有人在Gpg4Win的论坛上将此报告为错误。此时唯一的解决方案是从2.1.0回滚到以前的版本(在我的情况下不是选项),禁用密钥的密码,或从文本中输入密码。以下是论坛帖子:http://wald.intevation.org/forum/forum.php?thread_id=1116&forum_id=21&group_id=11开发团队没有评论。

答案 2 :(得分:1)

要避免使用对话框密码,请尝试使用此方法,我使用它并且效果很好,您会找到更多详细信息。

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;
    }

答案 3 :(得分:0)

  

注意:这样做是安全风险!

反正

  签名或解密时的

密码,除非您使用对称   加密。   手册页介绍了以下选项:


  

- 密码字符串

使用字符串作为密码。仅在仅提供一个密码短语时才能使用此选项。显然,这在多用户系统上的安全性非常可疑。不要用 这个选项,如果你可以避免它。

  

- passphrase-fd n

从文件描述符n中读取密码。只从文件描述符n中读取第一行。如果使用0表示将从stdin读取密码。这只能是 如果只提供一个密码,则使用。

--passphrase-file file

从文件文件中读取密码。只从文件文件中读取第一行。仅在仅提供一个密码短语时才能使用此选项。显然,存储了密码 如果其他用户可以读取此文件,则在文件中的安全性有问题。如果可以避免,请不要使用此选项。

官方pgp命令行实用程序使用-z标志提供此功能:

  

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