【问题标题】:PHP mycrypt problem, weird characters/warningsPHP mcrypt 问题,奇怪的字符/警告
【发布时间】:2010-10-27 23:44:49
【问题描述】:

我不知道我做错了什么。我只需要能够加密和解密而不会收到奇怪的字符或警告。它说我应该使用长度为 16 的 IV,并且我使用的长度为 9 但“0123456789abcdef”是 16 个字符。

警告:mcrypt_generic_init() [function.mcrypt-generic-init]:IV 大小不正确;提供的长度:9,需要:第 10 行 /home/mcondiff/public_html/projects/enc/enc.php 中的 16

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;

?>

有人能指出我正确的方向或指出我做错了什么吗?

谢谢

迈克

【问题讨论】:

  • 错误不在于密钥大小,而在于 IV 大小。 CIPHER_IV 的值是多少?

标签: php mcrypt


【解决方案1】:

在您的 php 文件中,打印 CIPHER_IV 并查看它包含的内容。

详情请见http://us2.php.net/mcrypt_generic_init

您可能从博客中复制粘贴了代码:谷歌搜索 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 声明为某物,然后使用它。

【讨论】:

    【解决方案2】:

    CIPHER_IV 可能是一个未定义的常量。 PHP 提出“使用未定义常量”的通知,然后使用“常量”作为字符串。字符串“CIPHER_IV”的长度为 9 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-27
      • 2013-05-29
      • 2012-03-04
      • 2011-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多