我如何编写一个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;
    }

我如何编写一个Process来从GnuPG调用——gen-key而不需要额外的步骤?

不要尝试根据交互式提示进行编程(这应该通过解析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