通过谷歌搜索经过大量加密/解密后,我设法构建这段代码。但是,它显示出以下错误,我无法弄清楚为什么会发生这种情况。
错误:警告: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);
它停止显示错误。
我无法确定我做错了什么。
答案 0 :(得分:1)
您将错误的算法名称传递给mcrypt_get_iv_size()
。您应该MCRYPT_CAST_256
时传递MCRYPT_RIJNDAEL_256
。
CAST-256的块大小为16字节,而MCRYPT_RIJNDAEL_256
指定Rijndael的块大小为32字节。这将导致错误。