首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GnuPG解密超时

GnuPG解密超时
EN

Stack Overflow用户
提问于 2014-04-01 06:56:03
回答 3查看 1.8K关注 0票数 3

我试图使用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,但没有显示有关它的错误消息)。

代码语言:javascript
复制
$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‘的非正常异常’异常‘”。

谢谢

EN

回答 3

Stack Overflow用户

发布于 2015-12-08 12:56:36

如果有人仍然面临这一问题(就像我一样),请阅读以下内容:

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

来自:http://php.net/manual/en/function.gnupg-decrypt.php

在删除密码之前,我通过cron运行的php脚本总是无法解密。我试着用没有密码的钥匙,它对我来说很好。

干杯!

票数 1
EN

Stack Overflow用户

发布于 2014-04-22 12:50:30

切换到新服务器时,我也遇到了同样的问题。对我来说,问题在于新服务器正在使用gpg2,而当前稳定的Crypt_GPG版本(1.3.2)不支持这一点。对我来说,它也解决了升级Crypt_GPG的新测试版(1.4.0b4)的问题。

票数 0
EN

Stack Overflow用户

发布于 2014-07-22 22:25:43

我今天遇到了和你一样的问题。如何解密简单文件的没完没了的疑难解答。PHP将无休止地挂起,即使我正在解密一个568字节的文件。解决方案是不使用内置的PHP函数,而是使用PEAR Crypt_GPG库。

首先安装库(1.4.0b4,另一个答案):

代码语言:javascript
复制
pear install Crypt_GPG-1.4.0b4

完成之后,进入php文件并使用以下代码作为示例:

代码语言:javascript
复制
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

不要忘记添加您的公钥(只需要运行一次):

代码语言:javascript
复制
$gpg->importKey(file_get_contents("/path/to/public-key.key"));

列表键:

代码语言:javascript
复制
$keys = $gpg->getKeys();
print_r($keys);

向GPG对象添加解密密钥

代码语言:javascript
复制
$gpg->addDecryptKey($keys[0],"key passphrase");

现在,解密您的文件:

代码语言:javascript
复制
file_put_contents($unencrypted_file,$gpg->decrypt(file_get_contents($encrypted_file)));

我希望这对人们有帮助,因为哇.我花了一整天的时间试图弄清楚如何在PHP中解密一个文件。我可以在5分钟内在C#上做一些事情。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22778844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档