我从Solaris OS移植了Linux C ++应用程序,应用程序需要通过gpg(或gpg2)将一些文本数据写入加密文件。因此,文本数据应直接写入gpg(加密文件)。 我创建了管道:
if(pipe(pipes) == -1)
throw Exception("Error creating pipes");
switch(fork())
{
case -1:
throw Exception("fork() failure");
case 0: // child process
close(pipes[PIPE_PARENT]);
close(READ);
close(ERR);
if(dup(pipes[PIPE_CHILD]) != READ)
throw Exception("dup() failure, READ descriptor unavailable");
execlp("gpg", "gpg", "--no-tty", "-r", "username", "-e", "-o", "home/username/out.pgp", NULL);
break;
}
... 然后我使用write():
intWCount = write(intTextFD, strData.str().c_str(), strData.str().size());
然后我看到errno == 9,intWCount = -1。 从STDOUT我得到:
“gpg:警告:重新打开标准错误”
并且文本数据不会写入文件。 我使用Ubuntu 16.04,gpg(GnuPG)1.4.20,gcc 5.4.0。
主要问题是 - 如何安全地将我的文本数据写入加密的gpg文件?
谢谢!
答案 0 :(得分:0)
https://wiki.gnupg.org/APIs声明:
许多老程序应用程序在子进程中调用GnuPG可执行文件,并通过命令行参数和文件描述符与它们进行交互。这不太适合GPGME,因为命令行参数和文本输出不是GnuPG的(官方)API。尽管已经努力使它们保持稳定,但使用官方GPGME API可以更精确地管理它,从而最终获得更强大的解决方案。
正确的方法是使用gpgme作为api,它有c ++绑定。
如果您完全确定要自己这样做,可能需要考虑popen()在没有“--no-tty”的情况下使用二进制文件并写入生成的文件指针。这是次优的,因为GnuPG不会提出问题,你需要准备让你的程序回答它们。
使用API更为可取。