如何调用CMD从Java创建GnuPG密钥对

如何调用CMD从Java创建GnuPG密钥对,java,console,runtime,processbuilder,gnupg,Java,Console,Runtime,Processbuilder,Gnupg,我试图用Java执行一个gpg命令来创建一个新的密钥对,但是我没有从控制台得到答案。如果我尝试对版本gpg--version执行gpg命令,或者使用gpg--list键检索keylist,那么我的代码工作得很好 我使用的代码来自另一个: 我还尝试了ProcessBuilder而不是Runtime,但这不是解决方案。 您是否知道如何解决此问题,或者在密钥生成过程中完全不可能与控制台交互?gpg--genkey是一个交互式调用,它等待输入,而您从不提供输入。两种可能的解决办法: 改用bouncyca

我试图用Java执行一个gpg命令来创建一个新的密钥对,但是我没有从控制台得到答案。如果我尝试对版本
gpg--version
执行gpg命令,或者使用
gpg--list键检索keylist,那么我的代码工作得很好

我使用的代码来自另一个:

我还尝试了
ProcessBuilder
而不是
Runtime
,但这不是解决方案。 您是否知道如何解决此问题,或者在密钥生成过程中完全不可能与控制台交互?

gpg--genkey
是一个交互式调用,它等待输入,而您从不提供输入。两种可能的解决办法:

  • 改用bouncycastle,它是OpenPGP的本机Java库
  • 由于实现交互式GnuPG会话将相当复杂且容易出错,因此最好使用“实验特性”来生成批密钥。从
    man gpg

    --gen键
    生成一个新的密钥对。此命令通常仅用于
    互动的。
    有一个实验特性,可以让你创建
    批处理模式下的键。请参阅中的文件“doc/DETAILS”
    关于如何使用此功能的源代码分发。
    
    档案。您要查找的部分称为“无人参与密钥生成”。这相当长,所以我没有在这里引用,但这是文档中关于如何执行的示例:


    $cat>foo非常感谢!虽然我也更喜欢使用BouncyCastle,但在这个项目中它是没有选项的。我将尝试实验功能。再次:谢谢:)如果不能使用bouncycastle,这个问题非常类似(甚至是重复)
    
    public void getKeyList(){
        try {
    
            Process gpgProcess = Runtime.getRuntime().exec("gpg --gen-key");
    
            BufferedReader gpgOutput = new BufferedReader(new InputStreamReader(gpgProcess.getInputStream()));
            BufferedWriter gpgInput = new BufferedWriter(new OutputStreamWriter(gpgProcess.getOutputStream()));
            BufferedReader gpgErrorOutput = new BufferedReader(new InputStreamReader(gpgProcess.getErrorStream()));
    
            boolean executing = true;
    
            while(executing){
                  try {
                    int exitValue = gpgProcess.exitValue();
    
                    if (gpgErrorOutput.ready()){
                        String error = getStreamText(gpgErrorOutput);
                        System.err.println(error);
                    }else if (gpgOutput.ready()){
                        System.out.println(getStreamText(gpgOutput));
    
                    }
                } catch (Exception e){
                  //The process is not yet ready to exit.  Take a break and try again.
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e1) {
                        System.err.println("This thread has insomnia: " + e1.getMessage());
                    }
                }
            }
    
    
        } catch (IOException e){
            e.printStackTrace();
        }
    
    }
    
    private String getStreamText(BufferedReader reader) throws IOException{
        StringBuilder result = new StringBuilder();
        try{
            while(reader.ready()){
                result.append(reader.readLine());
                if(reader.ready()){
                    result.append("\n");
                }
            }
        }catch(IOException ioe){
            System.err.println("Error while reading the stream: " + ioe.getMessage());
            throw ioe;
        }
        return result.toString();
    }