我尝试使用php GnuPG函数使用私钥解密gpg文件。但是,当试图解密它看起来像只是挂起或永远完成。我试图用一个句子解密一个简单的测试文件。
我可以脱机解密文件(例如使用GNU Privacy Assistant)。
我认为我已将权限设置为okay-
-bash-4.1 $ gpgconf --list-dirs
/home/jdoe/.gnupg/gpg.conf,perms:0770
/home/jdoe/.gnupg/pubring.gpg〜,烫发:0770
/home/jdoe/.gnupg/secring.gpg,烫发:0660
/home/jdoe/.gnupg/private-keys-v1.d,烫发:0700
/home/jdoe/.gnupg/random_seed,烫发:0600
/home/jdoe/.gnupg/pubring.gpg,烫发:0770
/home/jdoe/.gnupg/trustdb.gpg,烫发:0770
但是,如果我写一个新文件到" /home/jdoe/.gnupg /"它提供了644个权限(不确定这是否重要)。
/home/jdoe/.gnupg/xxxtest.txt.gpg,perms:0644
我(想)我已成功导入私钥。 KeyInfo如下。相关密钥的指纹和密钥ID为888(我用888替换了它们的实际值)。我将所有密钥包含在相关内容中(我用777替换了不相关的指纹/密钥信息)。
$ info = $ gpg-> keyinfo(''); echo'关键信息:' 。 print_r($ info,true);
数组([0] =>数组([禁用] => [过期] => [已撤销] => [is_secret] => [can_sign] => 1 [can_encrypt] => 1 [uids] =>数组([0] =>数组([名称] => ApacheTest [评论] =>测试[email] => apache @ localhost [uid] => ApacheTest(测试) [revoked] => [invalid] =>))[subkeys] =>数组([0] =>数组([指纹] => 777 [keyid] => 777 [时间戳] => 1203433839 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => [can_sign] => 1 [禁用] => [过期] => [已撤销] =&gt ;)[1] =>数组([指纹] => 777 [keyid] => 777 [时间戳] => 1203433840 [到期] => 0 [is_secret] => [无效] => [can_encrypt] => 1 [can_sign] => [禁用] => [过期] => [已撤销] =>)))[1] =>数组([已禁用] => [已过期] => [已撤销] => [is_secret] => [can_sign] => 1 [can_encrypt] => 1 [uids] =>数组([0] =>数组([名称] = > John Doe [评论] => [email] => john.doe@example.com [uid] => John Doe [已撤销] => [无效] => ))[subkeys] =>数组([0] =>数组([指纹] => 888 [keyid] => 888 [时间戳] => 1224013510 [到期] => 0 [is_secret] => [无效] => [can_encrypt] => [can_sign] => 1 [禁用] => [过期] => [已撤销] =>)[1] =>数组([指纹] => 777 [keyid] => 777 [timestamp] => 1224013510 [expires] => 0 [is_secret] => [invalid] => [can_encrypt] => 1 [can_sign] => [禁用] => [已过期] => [已撤销] =>))))
我的问题是,当尝试使用下面的代码进行解密时,看起来像php只是挂起或永远完成(实际上超过max_execution_time,但没有显示有关它的错误消息)。
$gpg = new gnupg();
$gpg->seterrormode(gnupg::ERROR_EXCEPTION);
putenv("GNUPGHOME=/home/jdoe/.gnupg");
$encryptedContent = file_get_contents($filePathAndName);
$pw = [];
$fingerprint = [];
if($gpg->adddecryptkey($recipient, $pw)) {
echo "Add decrypt key returned true.";
} else {
echo "Could not add decrypt key. GPG error: " . $gpg -> geterror();
}
//I know we get to this spot
try {
$plaintext = $gpg->decrypt($encryptedContent);
echo '<pre>' . $plaintext . '</pre>';
} catch (Exception $e) {
die('ERROR: ' . $e->getMessage());
}
关于为什么这不起作用的任何想法?非常感谢。
============== 输出来自ls -la /home/jdoe/.gnupg
drwxrwx --- 3 jdoe apache 4096 3月31日23:45。
drwxr-xr-x 19 jdoe root 12288 Apr 1 09:39 ..
-rwxrwx --- 1 jdoe apache 9188 Mar 28 15:36 gpg.conf
drwx ------ 2 apache apache 4096 3月31日21:26 private-keys-v1.d
-rwxrwx --- 1 apache apache 2479 Mar 31 21:26 pubring.gpg
-rwxrwx --- 1 apache apache 913 Mar 31 20:28 pubring.gpg~
-rw ------- 1 apache apache 600 Mar 31 20:32 random_seed
-rw-rw ---- 1 jdoe apache 1978年3月28日21:05 secring.gpg
-rwxrwx --- 1 apache apache 10 Mar 31 20:28 test.txt
-rwxrwx --- 1 jdoe apache 1200 Mar 31 20:28 trustdb.gpg
-rw-r - r-- 1 apache apache 347 Mar 31 23:30 xxxtest.txt.gpg
您可以从命令行解密文件吗?需要多长时间?
将使用此信息回复您(在此处使用SA,我只能通过ftp访问该计算机)。
尝试增加PHP的错误报告?
已经完成......它只是旋转(我假设它意味着超时,退出exit_on_timeout)。我已经尝试了10分30秒超时。结果是一样的。我们正在解密的测试文件少于100个字符。
您可能想尝试不设置主目录,但使用import($ keydata)导入密钥
相同的结果
尝试设置不同的主目录?
我创建了/home/jdoe/.gnupg/temp,chmod权限为777.我将其设置为gpg的主目录。我试图导入私钥。但是,$ gpg-&gt; keyinfo(&#39;&#39;)什么都不返回。这次试用$ gpg-&gt; adddecryptkey时,它会因此错误而失败 - &#34;未捕获的异常&#39;异常&#39;消息&#39; get_key失败&#39;&#34;。
由于
答案 0 :(得分:1)
如果有人仍然面临这个问题(就像我一样),请阅读:
从gnupg版本2开始,无法再传递普通密码。该参数被简单地忽略。相反,如果php在cli模式下运行,将启动pinentry应用程序。在cgi或apache模式下,打开密钥将失败。 最简单的解决方案是使用没有密码的密钥。
来自:http://php.net/manual/en/function.gnupg-decrypt.php
我通过cron运行的php脚本总是无法解密,直到我删除了密码。我尝试使用没有密码的密钥,它对我来说很好。
干杯!
答案 1 :(得分:0)
切换到新服务器时遇到了同样的问题。对我来说问题是新服务器正在使用gpg2,Crypt_GPG的当前稳定版本(1.3.2)不支持此功能。 对我来说,它解决了升级Crypt_GPG的新测试版(1.4.0b4)的问题。
答案 2 :(得分:0)
我遇到了和你今天一样的问题。关于如何解密简单文件的无休止的故障排除。 PHP会无休止地挂起,即使我正在解密568字节的文件。解决方案是不使用内置的PHP函数,而是使用PEAR Crypt_GPG库
首先安装库(1.4.0b4,如另一个答案所示):
pear install Crypt_GPG-1.4.0b4
完成后,进入php文件并使用以下代码作为示例:
set_include_path("/usr/share/pear"); //ADD PEAR FOLDER TO INCLUDE PATH
require_once 'Crypt/GPG.php'; //INCLUDE PEAR LIBRARY
$options = array('homedir' => '/tmp'); //KEYRING DIRECTORY
$gpg = new Crypt_GPG($options); //MAKE NEW GPG OBJECT
现在,熟悉Crypt_GPG课程:http://pear.php.net/package/Crypt_GPG/docs/latest/Crypt_GPG/Crypt_GPG.html
不要忘记添加公钥(只需要运行一次):
$gpg->importKey(file_get_contents("/path/to/public-key.key"));
列表键:
$keys = $gpg->getKeys();
print_r($keys);
向GPG对象添加解密密钥
$gpg->addDecryptKey($keys[0],"key passphrase");
现在,解密您的文件:
file_put_contents($unencrypted_file,$gpg->decrypt(file_get_contents($encrypted_file)));
我希望这对人们有所帮助,因为哇......我整天花了很多时间试图找出如何用PHP解密文件。我可以在大约5分钟内在C#中做些什么。