2017-02-22 29 views
1

我有從Solaris OS移植的Linux C++應用程序,應用程序需要通過gpg(或gpg2)將一些文本數據寫入加密文件。所以文本數據應該直接寫入gpg(加密文件)。 創建管道:在Linux中尋找正確的方式將加密文本從C++應用程序寫入加密的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

https://wiki.gnupg.org/APIs狀態是:

許多老年人應用程序調用的GnuPG可執行文件在子進程,並通過命令行參數和文件的描述與它們進行交互。這對於GPGME來說不太合適,因爲命令行參數和文本輸出不是GnuPG的(官方)API。儘管爲了保持它們的穩定性而努力,但使用官方的GPGME API可以更精確地進行管理,從而最終形成更強大的解決方案。

正確的方法是使用gpgme作爲api,它具有C++綁定。

如果你完全確定你想自己做,你可以考慮popen()引用沒有「--no-tty」的二進制文件並寫入結果文件指針。然而,這是次優的,因爲GnuPG不會提出問題,並且您需要準備好讓程序回答它們。

使用API​​更爲可取。

+0

謝謝,我想到了建議的方式。我使用了-r [username]開關,並且終端中的測試沒有警告或錯誤。同時,我嘗試刪除gpg選項中的「--no-tty」,但結果相同 - 我在調試/輸出中收到了警告,並且gpg無法使用(errno 9)。 –

+0

ERR是否與STDERR具有相同的FD?你有沒有嘗試做同樣的事情沒有關閉()錯誤?對我來說,看起來GnuPG抱怨沒有STERR並且不得不重新打開它。 我只是做了 int main(void) FILE * fp = popen(「gpg2 -r 1346E6A5 -e -o /tmp/out.pgp」,「w」);寫(「foo」,fp,4); return(0); } – SunTsu

+0

我試過兩種方法。當我試圖用命令模擬動作時,gpg(gpg -e -r username -o filename)沒有將文本從鍵盤寫入文件。 gpg製作了這個文件,它只做了標題。 –