Php mcrypt未解密到相同长度
我正在尝试使用我创建的类(下面的方法)来mcrypt一些数据。这就是您如何使用pack对数据进行mcrypt,然后使用unpack将数据取回Php mcrypt未解密到相同长度,php,json,mcrypt,Php,Json,Mcrypt,我正在尝试使用我创建的类(下面的方法)来mcrypt一些数据。这就是您如何使用pack对数据进行mcrypt,然后使用unpack将数据取回 $packed = $server->cache->pack("packed", array(123,123,123), "Password"); if(!$packed){ echo "Could not encrypt data\n"; } $server->cache->unpack("packed", "Passwo
$packed = $server->cache->pack("packed", array(123,123,123), "Password");
if(!$packed){
echo "Could not encrypt data\n";
}
$server->cache->unpack("packed", "Password");
当我打包它时,我对json\u encode()
数据执行var\u dump
,并得到以下信息:string(13)“[123123]”
当我解包时,我在mcrypt\u decode()
字符串上执行var\u dump
,并得到以下结果:string(32)“[123123]”
为什么长度不同?当我在mcrypt\u decode()
字符串上执行json\u decode()
时,返回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);
}
当使用像ECB这样的分组密码模式时(您不应该使用该模式),MCrypt将对数据进行NUL pad,以便其长度可以除以加密算法的块大小
如果必须知道,Rijndael-256的块大小是256位或32字节
考虑到您正在加密JSON数据,您只需rtrim()
数据就可以了,不用担心它。除非你切换到CTR这样的计数器模式,否则没有办法解决这个问题