【问题标题】:Command line GPG decrypting using c# - passphrase?命令行 GPG 解密使用 c# - 密码?
【发布时间】:2010-11-01 14:47:00
【问题描述】:

我正在使用命令行来加密我要发送的文件,但我正在尝试弄清楚如何使用相同的方法来解密它们。如果我运行命令,它会提示输入密码,但我看不到使用命令行传递密码的方法。这是我加密文件的方式:

var proc = new Process();
proc.EnableRaisingEvents = false;
proc.StartInfo.WorkingDirectory = "C:\\";
proc.StartInfo.FileName = @"C:\Progra~1\GNU\GnuPG\gpg.exe";
proc.StartInfo.Arguments = @"-e -u ""user1@example.com"" -r ""user2@example.com"" ""C:\file.csc""";
proc.Start();
proc.WaitForExit();

** 这是用于我的解决方案的有用链接: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/38c21304-fc7a-42cc-a5fb-dcb6da7f6411/

【问题讨论】:

    标签: c# .net gnupg


    【解决方案1】:

    Process.StandardInput 属性应该为您提供一个 StreamWriter,您可以使用它在标准输入上提供密码。

    【讨论】:

    • 我试图通过使用 MSDN 示例添加以下行来使其工作,但它似乎没有将密码短语发送到显示器。我必须手动将它们输入到 cmd 窗口中。 proc.StartInfo.UseShellExecute = false; proc.StartInfo.RedirectStandardInput = true; proc.Start(); StreamWriter myStreamWriter = proc.StandardInput; myStreamWriter.Write("1234"); myStreamWriter.Close();
    • 我现在可以使用它了。 proc.Start(); proc.StandardInput.WriteLine(密码); proc.StandardInput.Flush();
    【解决方案2】:

    Linux 上的 GPG 有 --passphrase-fd N,其中 N 是 int。如果 N == 0,则从标准输入读取密码。

    不确定这是否同样适用于 Windows,但可能值得一试。

    【讨论】:

    • 是的,在 Windows 上可用(至少使用 gpg4win 安装)。
    【解决方案3】:

    使用--passphrase-fd 0 让 GPG 从标准输入获取密码,然后使用管道将其传递。

    echo 123456| gpg --passphrase-fd 0 -e -u user1@example.com -r user2@example.com C:\file.csc
    

    gpg --passphrase-fd 0 -e -u user1@example.com -r user2@example.com --passphrase-fd 2 file.csc < password.file
    

    确保不要在标准输入上传递任何额外的空格,因为 GPG 不能很好地处理这些。

    我不确定如何在 .NET 上的标准输入上传递一些东西,所以你必须填补那里的空白。

    【讨论】:

    • 我让第一个工作,但我的密码包含一个 '>' 所以我将该示例与另一个文件一起使用,该文件的密码不包含此字符。我使用 --passphrase-file "pass.txt" 得到了原始文件,但在文本文件中使用我的密码短语几乎不安全......
    最近更新 更多