如何调用CMD从Java创建GnuPG密钥对
我试图用Java执行一个gpg命令来创建一个新的密钥对,但是我没有从控制台得到答案。如果我尝试对版本如何调用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
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();
}