在Laravel之外解密加密值

6

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


OpenSSL有一个命令行界面,可能会起作用。 - Lily Hahn
2个回答

4

Laravel的Encrypter类使用具有256位块大小的Rijndael进行加密,这是由Mcrypt PHP扩展提供的。 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源代码

希望这可以帮助您。


1
Laravel的Encrypter类容易发生变化,这是由于某些安全漏洞已得到修复。因此,要成功解密,您需要执行以下操作:
  1. 获取正确的源代码,例如4.2.16
  2. 在您的计算机上使其运行。确保您在相同的PHP环境下运行(对于最新版本,使用OpenSSL扩展);
  3. 使用正确的密钥实例化Encrypter类,并可能设置正确的模式和算法;
  4. 最后,调用decrypt
所有其他解密所需的参数(IV和MAC值)应包含在密文中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接