寻找在Linux中将加密文本从C ++应用程序写入加密gpg文件的正确方法

时间:2017-02-22 11:00:00

标签: c++ linux gcc encryption gnupg

我从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文件?

谢谢!

1 个答案:

答案 0 :(得分:0)

https://wiki.gnupg.org/APIs声明:

  

许多老程序应用程序在子进程中调用GnuPG可执行文件,并通过命令行参数和文件描述符与它们进行交互。这不太适合GPGME,因为命令行参数和文本输出不是GnuPG的(官方)API。尽管已经努力使它们保持稳定,但使用官方GPGME API可以更精确地管理它,从而最终获得更强大的解决方案。

正确的方法是使用gpgme作为api,它有c ++绑定。

如果您完全确定要自己这样做,可能需要考虑popen()在没有“--no-tty”的情况下使用二进制文件并写入生成的文件指针。这是次优的,因为GnuPG不会提出问题,你需要准备让你的程序回答它们。

使用API​​更为可取。