我正在尝试编写一个控制台应用程序,它将根据请求解密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文件中。
提前感谢您的帮助。
答案 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