我有从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文件?
谢谢您!
最佳答案
https://wiki.gnupg.org/APIs声明如下:
许多老的应用程序在子进程中调用gnupg可执行文件,并通过命令行参数和文件描述符与它们交互。这对gpgme来说不太好用,因为命令行参数和文本输出不是gnupg的(官方)api。虽然已经做出了努力来保持它们的稳定性,但是使用官方的gpgme api可以更精确地管理这一点,因此您最终会得到一个更健壮的解决方案。
正确的方法是使用gpgme作为api,它有c++绑定。
如果您完全确定要自己执行此操作,则可能需要考虑popen()在不使用“-no tty”的情况下打开二进制文件并写入结果文件指针。不过,这是次优的,因为gnupg习惯于提出问题,您需要准备好让您的程序回答这些问题。
最好使用api。
关于c++ - 寻找在Linux中将C++应用程序中的加密文本写入加密的gpg文件的正确方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42389350/