1

我正在尝试使用我创建的类(下面的方法)对一些数据进行加密。这就是你如何 mcrypt 数据然后使用 pack,然后你可以使用 unpack 来取回数据。

$packed = $server->cache->pack("packed", array(123,123,123), "Password");
if(!$packed){
    echo "Could not encrypt data\n";
}
$server->cache->unpack("packed", "Password");

当我打包它时,我var_dumpjson_encode()数据做一个,并得到这个:
string(13) "[123,123,123]"

当我打开它时,我var_dumpmcrypt_decode()字符串上做一个,然后得到这个:
string(32) "[123,123,123]"

为什么长度不一样?当我json_decode()mcrypt_decode()弦上做 a 时,我null回来了,这就是原因。如果我修剪数据它可以工作,但我不应该修剪它。

以下是方法:

<?php
public function put($key, $value, $life = 0)
{
    $this->cache[$key] = $value;
    $life              = (int)$life;
    if($life > 0)
    {
        $life = strtotime("now + $life seconds");
    }

    $this->life[$key] = $life;
}

public function get($key)
{
    return $this->cache[$key];
}

public function pack($key, $value, $secret, $life = 0)
{
    if(!function_exists("mcrypt_encrypt"))
    {
        $this->put($key, $value, $life);
        return false;
    }
    $iv_size   = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv        = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $value     = json_encode($value);
    var_dump($value);
    $cryptdata = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $secret, $value, MCRYPT_MODE_ECB, $iv);
    $this->put($key, $cryptdata, $life);
    return true;
}

public function unpack($key, $secret)
{
    if(!function_exists("mcrypt_decrypt"))
    {
        return json_decode($this->get($key), true);
    }
    $cryptdata = $this->get($key);
    $iv_size   = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv        = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    $data      = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $secret, $cryptdata, MCRYPT_MODE_ECB, $iv);
    //$data      = json_decode($data, true);
    var_dump($data);
}
4

1 回答 1

0

当使用像 ECB 这样的分组密码模式时(顺便说一句,你不应该使用那个),MCrypt 将对数据进行 NUL 填充,这样它的长度就可以被加密算法的块大小整除。

如果您必须知道,对于 Rijndael-256,块大小为 256 位或 32 字节。

考虑到您正在加密 JSON 数据,您可以只rtrim()处理数据而不用担心它。除非您切换到 CTR 之类的计数器模式,否则无法解决此问题。

于 2014-07-11T23:02:06.590 回答