6

我正在尝试编写一个控制台应用程序,它将根据请求解密 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

4 回答 4

3

一起使用--batch --passphrase-fd选项,.eggpg2 --batch --passphrase-fd 0 --armor --decrypt /path/to/encrypted_file.pgp

在您的代码中,proc.StandardInput.WriteLine(sCommandLine);添加以下内容后:

proc.StandardInput.WriteLine("your passphrase here");
proc.StandardInput.Flush();
于 2014-06-02T13:56:10.850 回答
2

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

于 2013-03-26T00:19:57.437 回答
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;
    }
于 2013-12-12T21:11:23.527 回答
0

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

反正,

签名或解密时的密码,除非您使用对称加密。手册页记录了以下选项:


--密码字符串

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

--passphrase-fd n

从文件描述符 n 中读取密码。只有第一行将从文件描述符 n 中读取。如果您使用 0 作为密码,将从标准输入读取。仅当仅提供一个密码时才能使用此功能。

--passphrase-file file

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

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

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

于 2013-03-26T00:43:19.013 回答