这是我第一次需要这样做。
我必须在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文件?
提前致谢。
答案 0 :(得分:2)
根据文件评论:
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
或类似,以查看实际发生的情况......