2017-02-22 4 views
1

Solaris OSから移植されたLinux C++アプリケーションがあり、gpg(またはgpg2)を介してテキストデータを暗号化ファイルに書き込む必要があります。したがって、テキストデータはgpg(暗号化されたファイル)に直接書き込まれる必要があります。 )その後、私は(書き込みを使用暗号化されたテキストをC++アプリケーションから暗号化されたgpgファイルに書き込む正しい方法をLinuxで探す

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; 
} 

... : 私はパイプを作成

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の実行可能ファイルを呼び出し、コマンドライン引数とファイル・ディスクリプタを経由して彼らと対話します。コマンドライン引数とテキスト出力はGnuPGの(公式な)APIではないため、これはGPGMEにはあまりお勧めできません。それらを安定に保つために努力していますが、公式のGPGME APIを使用することで、これをより正確に管理できるため、より堅牢なソリューションになります。

正しい方法は、gpgmeをapiとして使用することです。これにはC++バインディングがあります。

自分自身でやりたければ、popen()を "--no-tty"なしで実行し、結果のファイルポインタに書き込むことが考えられます。 GnuPGは質問をする必要がなく、プログラムに答える準備ができている必要があるため、これは最適ではありません。

APIを使用する方が適しています。

+0

ありがとう、私は提案された方法を考えた。私は-r [username]スイッチを使い、端末のテストには警告もエラーもありませんでした。同時に私はgpgオプションで "--no-tty"を削除しようとしましたが、同じ結果を得ました。私はdebug/Outputで警告を受け取り、gpgは使用できませんでした(errno 9)。 –

+0

ERRはSTDERRと同じFDですか? ERRを閉じることなく同じことをやってみましたか?私には、GnuPGはSTERRを持たず、再オープンする必要があると不平を言うようです。 私は単純にした intメイン(void) { FILE * fp = popen( "gpg2 -r 1346E6A5 -e -o /tmp/out.pgp"、 "w"); write( "foo"、fp、4); return(0); } – SunTsu

+0

私は両方の方法を試しました。そして、コマンドでアクションをシミュレートしようとすると、gpg(gpg -e -r username -o filename)はキーボードからファイルにテキストを書き込まなかった。 gpgはファイルを作成し、ヘッダーのみを作成しました。 –

関連する問題