我如何编写一个Process来从GnuPG调用——gen-key而不需要额外的步骤?
本文关键字:不需要 gen-key 调用 GnuPG 何编写 来从 Process 一个 | 更新日期: 2023-09-27 18:02:04
我正在尝试为GnuPG创建一个自定义包装器。
到目前为止,对于--list-keys
, --version
等非常基本的gpg
命令,我做得很好。
但是对于一些需要额外步骤的人,我不知道如何解决它,例如--gen-key
,从选择加密算法到密钥对所有者的电子邮件有几个步骤,我如何使用System.Diagnostics.Process
来完成。这里是一个简单的代码,从一个当前已经工作。
protected const string GpgExe = "gpg";
protected Process GetProcess(string arguments)
{
ProcessStartInfo info = new ProcessStartInfo
{
FileName = GpgExe,
Arguments = arguments,
CreateNoWindow = true,
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
RedirectStandardInput = true
};
Process process = new Process { StartInfo = info };
return process;
}
public string GetVersion()
{
string version = "";
string arguments = "--version";
using (var process = this.GetProcess(arguments))
{
process.Start();
version = process.StandardOutput.ReadLine();
process.Close();
}
return version;
}
不要尝试根据交互式提示进行编程(这应该通过解析GnuPG的标准输出并随后提供匹配的输入来实现),而是使用GnuPG为这种情况提供的无人参与密钥生成功能。
链接的文档页面提供了一个小示例,展示了相当容易理解的语法:
$ cat >foo <<EOF
%echo Generating a basic OpenPGP key
Key-Type: DSA
Key-Length: 1024
Subkey-Type: ELG-E
Subkey-Length: 1024
Name-Real: Joe Tester
Name-Comment: with stupid passphrase
Name-Email: joe@foo.bar
Expire-Date: 0
Passphrase: abc
%pubring foo.pub
%secring foo.sec
# Do a commit here, so that we can later print "done" :-)
%commit
%echo done
EOF
$ gpg2 --batch --gen-key foo
[...]
$ gpg2 --no-default-keyring --secret-keyring ./foo.sec '
--keyring ./foo.pub --list-secret-keys
/home/wk/work/gnupg-stable/scratch/foo.sec
------------------------------------------
sec 1024D/915A878D 2000-03-09 Joe Tester (with stupid passphrase) <joe@foo.bar>
ssb 1024g/8F70E2C0 2000-03-09