因此,我正在尝试使用Laravel中的GPG进行一些编码。我找到了https://github.com/jasonhinkle/php-gpg软件包,尽管不再维护,但看起来仍然可以满足我的需要。我已将代码安装在自定义文件夹app/Classes/GPG
中,并将其包含在将使用它的artisan
命令中:
class CustomCommand extends Command {
private $gpg = null;
private $publicKey = null;
protected $signature = "custom:command";
public function __construct() {
$this->publicKey = new \GPG_Public_Key(file_get_contents(base_path()."/path/to/public/key.asc"));
$this->gpg = new \GPG();
parent::__construct();
}
public function handle() {
$this->gpg->encrypt($this->publicKey, "Hello World!");
}
}
使用上面的代码,一切都很好; $this->gpg
和$this->publicKey
都被初始化,没有问题,但是当我尝试运行php artisan custom:command
时,出现以下错误:
(1/1) ErrorException
中
发生字符串偏移量转换
在 GPG.php 行
类似于GPG.php
的112,如下所示:
private function gpg_session($key_id, $key_type, $session_key, $public_key){
...
$s = base64_decode($public_key);
$l = floor((ord($s[0]) * 256 + ord($s[1]) + 7) / 8);
if($key_type) {
...
$l2 = floor((ord($s[$l + 2]) * 256 + ord($s[$l + 3]) + 7) / 8) + 2; // 112
}
}
执行dd($s, $l)
会导致string
和256.0
的混乱,我可能无法在此处发布。
以前有没有人看过这个问题?
答案 0 :(得分:0)
问题在于此行:
$l = floor((ord($s[0]) * 256 + ord($s[1]) + 7) / 8); // 256.0
由于$l
是float
,而不是integer
,因此此行:
$l2 = floor((ord($s[$l + 2]) * 256 + ord($s[$l + 3]) + 7) / 8) + 2; // String offset cast occurred
在尝试访问$s[$l ...]
的两种情况下,均失败。要解决此问题,只需将$l
的声明包装在intval()
调用中以将其明确设置为integer
:
$l = intval(floor((ord($s[0]) * 256 + ord($s[1]) + 7) / 8)); // 256
此错误的原因是由于PHP版本引起的。在PHP 5.4之前,由于转换,尝试使用float
访问数组是有效的。给定$l = 256.0
,$s[$l]
将尝试访问$s[256]
。在PHP 5.4+中,引入了此错误,并且由于未维护此程序包,因此从未对其进行正确处理。希望这可以帮助其他人。