从命令行解密GPG字符串

本文关键字:字符串 GPG 解密 命令行 | 更新日期: 2023-09-27 18:06:01

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

提前感谢您的帮助。

从命令行解密GPG字符串

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

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

要避免对话框密码尝试这个方法,我使用它,它工作得很好,你会发现更多的细节。

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

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

,

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


——密码字符串

使用string作为密码短语。这只能在只提供一个密码短语时使用。显然,这在多用户系统上的安全性非常有问题。不要使用

——passphrase-fd n

从文件描述符n中读取密码。只会从文件描述符n中读取第一行。如果使用0,则会从stdin中读取密码。这只能是当只提供一个密码短语时使用。

--passphrase-file file

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

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

pgp -esa $SOURCEFILE $RECIPIENTPUBLICKEY -u $ sendprivatekey -z美元密码