openssl_encrypt():传递的iv密钥长24个字节,比预期的16个长

时间:2018-11-28 21:49:49

标签: php laravel encryption openssl

我在Laravel中使用openssl_encrypt,我在PHP 5.6之前就使用了此功能,但可以正常使用,但是在切换到Laravel之后,我从旧的Web应用程序中获取了加密和解密功能,但出现以下错误:

openssl_encrypt(): IV passed is 24 bytes long which is longer than the 16 expected by selected cipher, truncating
private $iv = "########################";
private $keys = "###########";

protected function encryption($plainData)
    {


        $cipher = "aes-256-cbc";
        $encryptedData = base64_encode(openssl_encrypt($plainData, $cipher, $this->keys, 1,$this->iv));
        return $encryptedData;

    }
    //decryption
    protected function decryption($encryptedData)
    {

        $decodeData = base64_decode($encryptedData);
        $cipher = "aes-256-cbc";
        $data = openssl_decrypt($decodeData, $cipher, $this->keys, 1,$this->iv);
        return $data;

    }

任何人都有什么见识,可以通过哪种方式解决此问题?

1 个答案:

答案 0 :(得分:0)

谈论 AES 的24字节初始化向量( IV )没有意义。 IV 仅应用于第一个加密块,并且由于 AES 适用于16字节的加密块,因此IV必须为16字节。为 IV 指定的长度超过16个字节的话,如果不彻底给您带来错误(您似乎同时遇到了这两种情况),则会固有地包含一些截断。

关于 IV 的使用,您不应使用硬编码值,而应为每封邮件使用唯一的 IV 。由于 IV 对于邮件是唯一的,因此您需要将其与邮件一起存储。在邮件中加上 IV 是一种常见的做法,因此在需要解密邮件时很方便。