[PHP-users 26946] Re: proc_open()を使用してGnuPGの復号化をしたい

matsui 9999 matsumatsu9999 @ hotmail.co.jp
2005年 9月 21日 (水) 18:29:49 JST


Matsuiです。

喜瀬“冬猫”浩 さん、高橋さん、かなださん、
アドバイスありがとうございます。

>パスフレーズなしの鍵を作る、という方法もあります。参考までに。

パスフレーズ無の鍵を使用したら
同じプログラムで復号化できました!

今は何故、パスフレーズ有の鍵で失敗するのか気になっています。

>/dev/ttyへの書き込みができないということかな?
>/dev/ttyのパーミッションを確認されたらいかがでしょうか。
>参考までに手元にあるサーバ(OSは異なりますが)ではcrw-rw-rw-でした。

パーミッションを確認したところ同じでした。
試しにcrwxrwxrwxにして、パスフレーズ有の鍵で
同じプログラムを実行したところ同じ症状が発生します。
復号化できませんでした。

/tmp/error.txtに
gpg: cannot open /dev/tty: そのようなデバイスやアドレスはありません
と追記されます。

>batchmodeを追っかけてみると、gpgのオプ
>ションに--batchをつけるとbatchmodeがセットされる(で、
>ttypfpがstderrにセットされる)ようです(解決になるかど
>うか分かりませんが)。

batchモード(非対話モード)で実行してみました。
パスフレーズ有の鍵でも、この方法だと復号化できました。
----------------------------------------
<?php
// GnuPGのPATH
putenv("GNUPGHOME=/var/www/.gnupg");

// ファイル指定
$plain = "/var/www/doc"; // 出力したい平文ファイル
$crypted = "/var/www/doc.gpg"; // 暗号化しているファイル

// GnuPGを実行しファイルを復号化する
$descriptorspec = array(
 0 => array("pipe", "r"), // 標準入力
 1 => array("pipe", "w"), // 標準出力
 2 => array("file", "/tmp/error.txt", "a") // エラー出力
);

$pass_phrase = "/var/www/himitufile"; // パスフレーズを保存した平文ファイル

$command = "cat {$pass_phrase} | gpg --no-tty --batch --passphrase-fd 0 
--output {$plain} --decrypt {$crypted}";
$process = proc_open($command, $descriptorspec, $pipes);

if(is_resource($process)){
 // 非対話なので何もしない
 fclose($pipes[0]);
 fclose($pipes[1]);
 
 proc_close($process);
}
?>
----------------------------------------
・・・proc_open()を使う意味が薄れてしまいました。
proc_open()を使用しなくてもsystem()で実現できました。

対話モードでパスフレーズを渡せない事が気になっていますが
PHPでGnuPGによる暗号化、復号化をする事ができました。

どうもありがとうございました。

_________________________________________________________________
無料でメールボックス250MBの 「MSN Hotmail」 http://www.hotmail.com/ 



PHP-users メーリングリストの案内