Laravel GPG-尝试编码时出现的问题

时间:2018-07-26 17:49:42

标签: php laravel gnupg

因此,我正在尝试使用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)会导致string256.0的混乱,我可能无法在此处发布。

以前有没有人看过这个问题?

1 个答案:

答案 0 :(得分:0)

问题在于此行:

$l = floor((ord($s[0]) * 256 + ord($s[1]) + 7) / 8); // 256.0

由于$lfloat,而不是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+中,引入了此错误,并且由于未维护此程序包,因此从未对其进行正确处理。希望这可以帮助其他人。