如何使用php cli

时间:2017-11-09 16:36:56

标签: php gnupg

这是我第一次需要这样做。

我必须在php中编写脚本以运行cli,脚本传递一个.zip文件,我必须解压缩,里面的文件是.pgp文件,我需要解密这些文件,我有以下代码

function decryptPGPFiles($pgpFiles, $passphrase){
  $res = gnupg_init();
  foreach($pgpFiles as $filename){
    gnupg_adddecryptkey($res,"XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",$passphrase);
    $cipher = file_get_contents($filename);
    $plain = gnupg_decrypt($res,$cipher);
    var_dump($plain);
    die;
  }
}

当然'var_dump($ plain);'和'死;'只是为了测试。无论如何,$ plain总是假的。假设$ pgpFiles是当前目录中.pgp文件的文件名数组。

我在当前dir中有一个名为'private.gpg'的私钥,而且我也知道$ passphrase。

我知道函数'gnupg_adddecryptkey'的第二个参数是根据php.net的$指纹,当我运行'gpg --import private.gpg'然后'gpg --fingerprint'时它会出现相应的指纹那是我作为参数传递的那个,无论如何,指纹出现了几个空白区域,我修剪它们。

我确定我没有采取正确的步骤,但我找不到足够清晰的文档。甚至可以从php cli解密.pgp文件?

提前致谢。

2 个答案:

答案 0 :(得分:2)

根据文件评论:

gnupg_decrypt

Mike

从gnupg版本2开始,无法再传递普通密码。该参数被简单地忽略。相反,如果php在cli模式下运行,将启动pinentry应用程序。在cgi或apache模式下,打开密钥将失败。 最简单的解决方案是使用没有密码的密钥。

就个人而言,我可能不会在没有上述密码的情况下使用密钥。我仍然在寻找更好的解决方案,但现在这样的事情已经奏效了:

shell_exec("gpg --batch --passphrase \"" . $passphrase . "\" -d $file > $decrypted_file_name");

如果传入潜在危险的变量,请考虑使用escapeshellarg()或escapeshellcmd()。

答案 1 :(得分:0)

您是否尝试在gnupg_geterror()之后调用gnupg_adddecryptkey()?我怀疑你的私钥实际上没有被接受。我认为它需要在PHP用户的GPG密钥环中(即无论是谁调用脚本,不一定是你的GPG密钥环)?同样在我运行的几个简短测试中,我不断被提示在终端上输入密码,但这可能是因为我的偏执gpg配置(我完全禁用了密码短语缓存)。这肯定会在非交互式场景中破坏......

另一种捕获错误的方法是将gnupg_seterrormode()设置为ERROR_EXCEPTION或类似,以查看实际发生的情况......