2013-03-20 79 views
1

我想使用我創建的類(下面的方法)來加密一些數據。這就是你如何使用包對數據進行加密,然後你可以使用解包來獲取數據。mcrypt不解密到相同的長度

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

當我收拾它,我做了json_encode()數據var_dump,並獲得這樣的:
string(13) "[123,123,123]"

當我拆開它,我做了var_dumpmcrypt_decode()字符串,得到這樣的:
string(32) "[123,123,123]"

爲什麼長度不同?當我在mcrypt_decode()字符串上做json_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); 
} 

回答

0

當使用塊密碼方式等ECB(你不應該使用那一個順便說一句),mcrypt的將NUL墊中的數據,使得其長度是可分割通過加密算法的塊大小。

如果您必須知道,對於Rijndael-256,塊大小爲256位或32個字節。

考慮到您正在加密JSON數據,您只需要rtrim()數據,而不用擔心。除非您切換到CTR等計數器模式,否則沒有辦法。