我试图使用php GnuPG函数用私钥解密一个gpg文件。但是,当试图解密时,php看起来就像是挂起或要花很长时间才能完成。我想解密一个简单的测试文件,里面只有一句话。
我可以离线解密文件(例如,使用GNU隐私助理)。
我想我设置了权限,好吗-
-bash-4.1美元gpgconf -名单-迪尔斯 /home/jdoe/..gnupg/gpg.conf,perms: 0770 /home/jdoe/..gnupg/pubring.gpg,perms: 0770/home/..gnupg/secring.gpg,perms: 0660/home/jdoe/..gnupg/私人密钥-v1.d,perms: 0700/home/jdoe/..gnupg/..gnupg/随机种子,perms: 0600/home/jdoe/..gnupg/pubring.gpg,perms: 0770/home/jdoe/..gnupg/tru.gpg,perms:
但是,如果我将一个新文件写入“/home/jdoe/..gnupg/”,就会得到644个权限(不确定这是否重要)。
/home/jdoe/..gnupg/xxxtest.txt.gpg,perms: 0644
我(想)已经成功导入了私钥。KeyInfo在下面。相关的密钥有一个指纹和888的密钥标识(我已经用888替换了它们的实际值)。我包括所有的钥匙,以防它是相关的(我已经用777替换了无关的指纹/密钥信息)。
$info = $gpg->keyinfo('');echo 'Key info:‘。print_r($info,真); 数组(禁用的=>数组(禁用的=>过期的=> is_secret => can_sign => 1 can_encrypt => 1 uid )数组( => Array (名称为=> ApacheTest注释)测试电子邮件=> apache@localhost uid => => (测试)已撤销=>无效)子键#en42 20# Array ((指纹777密钥标识777时间戳1203433839到期)en26 en27 en29 en31 en31 en34#en35)#1( Array 777 keyid # 777 777 en40 en42enen40#en42enen40#en40 en42en42en4)无效的=> can_encrypt => 1 can_sign =>禁用=>过期=>吊销=> )1 =>数组(禁用=>过期=> is_secret => can_sign => 1 => 1 uid => )( Array (名称John注释en21#电子邮件en23 John已被撤销无效))子键数组((指纹888键888键en31 en33 en34#无效en36#en38 en39 en40 en41 31 en32 en34 en35 en37 en39 en40 en31 en32 en33 en35 en38 en39 en41#en41 31 en32 en33 en34 en36 en38 en39 41en4 en41 31 en32 en33 en34 en36 en38 en39 en41 en4 en41#41enen en32 en33 en34( => )1 =>阵列(指纹=> 777密钥标识=> 777时间戳=> 1224013510过期=> 0 is_secret =>无效的=> can_encrypt => 1 can_sign => 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
rwxrwx-3 jdoe apache 4096 / 31 23:45 ..drwxr xr-x19 jdoe root 12288 / 09:39 .-rwxrwx--1 jdoe apache 9188 m28 15:36 gpg.condrwx-2 apache apache 40961 apache 600 31 20:32随机种子-rw-rw-1 jdoe apache 1978年3月28 21:05 secring.gpg-rwxrwx-1 apache 10
您能从命令行解密文件吗?需要多长时间?
将返回到您的这些信息(与SA在这方面的工作,我只有ftp访问机器)。
尝试增加PHP的错误报告吗?
已经完成了..。它只是旋转(我认为这意味着超时,out exit_on_timeout是关闭的)。我用了10分30秒的时间试过了。结果是一样的。我们正在解密的测试文件小于100个字符。
您可能需要尝试不设置主目录,而是使用导入($keydata)导入密钥。
相同结果
尝试设置不同的主目录?
我创建了/home/jdoe/..gnupg/temp,chmod对777的权限。我将此设置为gpg的主目录。我试图导入私钥。但是,$gpg->keyinfo('')什么也不返回.这一次,当尝试$gpg->adddecryptkey时,它会因此错误而失败--“带有消息'get_key failed‘的非正常异常’异常‘”。
谢谢
发布于 2015-12-08 12:56:36
如果有人仍然面临这一问题(就像我一样),请阅读以下内容:
从gnupg版本2开始,就不可能再传递普通密码了。该参数简单地被忽略。相反,在php以cli模式运行的情况下,将启动一个pinentry应用程序。在cgi或apache模式下,打开键将失败。最简单的解决方案是使用没有密码的密钥。
来自:http://php.net/manual/en/function.gnupg-decrypt.php
在删除密码之前,我通过cron运行的php脚本总是无法解密。我试着用没有密码的钥匙,它对我来说很好。
干杯!
发布于 2014-04-22 12:50:30
切换到新服务器时,我也遇到了同样的问题。对我来说,问题在于新服务器正在使用gpg2,而当前稳定的Crypt_GPG版本(1.3.2)不支持这一点。对我来说,它也解决了升级Crypt_GPG的新测试版(1.4.0b4)的问题。
发布于 2014-07-22 22:25:43
我今天遇到了和你一样的问题。如何解密简单文件的没完没了的疑难解答。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类: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#上做一些事情。
https://stackoverflow.com/questions/22778844
复制相似问题