4

如何仅使用 PHP 解密在 Laravel 之外使用 Laravel 4 Encrypt 类加密的字符串?

4

2 回答 2

3

LaravelEncrypter类使用由 Mcrypt PHP 扩展提供的块大小为 256 位的 Rijndael 进行加密。该类Encrypter使用两种简单的方法工作,encrypt()并且decrypt().

下面的一个例子:

<?php

$secret = Crypter::encrypt('some text here'); //encrypted

$decrypted_secret = Crypter::decrypt($secret); //decrypted

?>

既然你问如何“在 Laravel 之外”做到这一点:

加密和解密由加密器类完成。Laravel 源是公开的,这里是相关部分:

<?php

    public function encrypt($value)
    {
        $iv = mcrypt_create_iv($this->getIvSize(), $this->getRandomizer());
        $value = base64_encode($this->padAndMcrypt($value, $iv));
        $mac = $this->hash($iv = base64_encode($iv), $value);

        return base64_encode(json_encode(compact('iv', 'value', 'mac')));
    }

    protected function padAndMcrypt($value, $iv)
    {
        $value = $this->addPadding(serialize($value));
        return mcrypt_encrypt($this->cipher, $this->key, $value, $this->mode, $iv);
    }

    public function decrypt($payload)
    {
        $payload = $this->getJsonPayload($payload);
        $value = base64_decode($payload['value']);
        $iv = base64_decode($payload['iv']);
        return unserialize($this->stripPadding($this->mcryptDecrypt($value, $iv)));
    }

    protected function mcryptDecrypt($value, $iv)
    {
        return mcrypt_decrypt($this->cipher, $this->key, $value, $this->mode, $iv);
    }

?>

有关文档和评论,请参阅GitHub 上的Laravel 源代码

我希望这有帮助。

于 2013-06-30T15:06:12.317 回答
1

Laravel的Encrypter类容易发生变化。这是由于一些已修复的安全漏洞。因此,要成功解密,您需要执行以下操作:

  1. 获取正确的源代码,例如4.2.16
  2. 让它在你的机器上工作。确保您在相同的 PHP 环境中运行(使用最新版本的 OpenSSL 扩展);
  3. 使用正确的键实例化类Encrypter,并可能设置正确的模式和算法;
  4. 最后,调用decrypt.

解密所需的所有其他参数(IV 和 MAC 值)应包含在密文中。

于 2015-01-17T15:14:46.503 回答