获得此错误 - IV参数必须与块大小一样长

时间:2014-06-23 12:56:47

标签: php encryption

通过谷歌搜索经过大量加密/解密后,我设法构建这段代码。但是,它显示出以下错误,我无法弄清楚为什么会发生这种情况。

错误:警告:mcrypt_encrypt():IV参数必须与第16行/var/www/encrypt.php中的blocksize一样长

error_reporting(E_ALL ^ E_DEPRECATED);
ini_set('display_errors', '1');

class Cipher {
    private $securekey, $iv;
    function __construct($textkey) {
        $this->securekey = hash('sha256',$textkey,TRUE);
        //$this->iv = mcrypt_create_iv(32);
        $size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
        $this->iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);
    }

    function encrypt($input) {
        return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_CFB, $this->iv));
    }

    function decrypt($input) {
        return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_CFB, $this->iv));
    }
}

$cipher = new Cipher('secret passphrase');

$encryptedtext = $cipher->encrypt("hide me");
echo "->encrypt = $encryptedtext<br />";

$decryptedtext = $cipher->decrypt($encryptedtext);
echo "->decrypt = $decryptedtext<br />";

var_dump($cipher);

如果我在CONSTRUCTOR函数的两行后面发表评论..

$size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CFB);
$this->iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM);

&安培;取消注释这条线..

$this->iv = mcrypt_create_iv(32);

它停止显示错误。

我无法确定我做错了什么。

1 个答案:

答案 0 :(得分:1)

您将错误的算法名称传递给mcrypt_get_iv_size()。您应该MCRYPT_CAST_256时传递MCRYPT_RIJNDAEL_256

CAST-256的块大小为16字节,而MCRYPT_RIJNDAEL_256指定Rijndael的块大小为32字节。这将导致错误。