从命令行解密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文件中。
提前感谢您的帮助。
同时使用--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美元密码