我不知道我做错了什么。我只需要能够加密和解密而不会得到奇怪的字符或警告。它说我应该使用长度为16的IV并且我使用长度为9但“0123456789abcdef”是16个字符。
警告:mcrypt_generic_init()[function.mcrypt-generic-init]:Iv大小不正确;供应长度:9,需要:16英尺/home /mcondiff /public_html/projects/enc/enc.php第10行
请参阅http://www.teamconcept.org/projects/enc/enc.php
我迷茫,迷茫,有点头晕。我在这里离开?我必须使用这种加密技术并使其适用于项目。
<?php
class enc
{
function encrypt($str, $key) {
$key = $this->hex2bin($key);
$td = mcrypt_module_open("rijndael-128", "", "cbc", "fedcba9876543210");
mcrypt_generic_init($td, $key, CIPHER_IV);
$encrypted = mcrypt_generic($td, $str);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return bin2hex($encrypted);
}
function decrypt($code, $key) {
$key = $this->hex2bin($key);
$code = $this->hex2bin($code);
$td = mcrypt_module_open("rijndael-128", "", "cbc", "fedcba9876543210");
mcrypt_generic_init($td, $key, CIPHER_IV);
$decrypted = mdecrypt_generic($td, $code);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return utf8_encode(trim($decrypted));
}
function hex2bin($hexdata) {
$bindata = "";
for ($i = 0; $i < strlen($hexdata); $i += 2) {
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}
}
$theEncryption = new enc();
$user = "John Doe";
$email = "john@example.com";
$user = $theEncryption->encrypt($user, "0123456789abcdef");
$email = $theEncryption->encrypt($email, "0123456789abcdef");
echo 'User: '.$user;
echo 'Email: '.$email;
?>
能否指出我正确的方向或指出我做错了什么?
由于
麦克
答案 0 :(得分:2)
CIPHER_IV可能是一个未定义的常量。 PHP引发“使用未定义常量”通知,然后使用“常量”作为字符串。字符串“CIPHER_IV”长度为9个字符。
答案 1 :(得分:1)
在您的php文件中,执行CIPHER_IV的打印并查看它包含的内容。
有关详细信息,请参阅http://us2.php.net/mcrypt_generic_init
您可能已经从博客中复制粘贴代码:googling mcrypt_generic_init CIPHER_IV仅提供此帖子和博客;)
IV是您需要为函数指定的参数,而不是第一个博客作者误解第二个博客文章的常量。
在http://propaso.com/blog/?cat=6,他们声明了这些:
$secret_key = "01234567890abcde";
$iv = "fedcba9876543210";
然后执行:
mcrypt_generic_init($td, $secret_key, $iv);
只需声明你的IV,然后使用它。