2013-02-05 36 views
0

我使用两个简单的函数来加密和解密密码。但解密功能并不正确。这里是我的输出:Mcrypt解密不工作 - PHP

加密:\#%\> 3,OSDC
解密:test123

,这里是我的代码:

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); 

function encrypt($data) 
{ 
    $key = 'test'; 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv); 
    return $encrypted_data; 
} 

function decrypt($encryptedData) 
{  
    $key = 'test'; 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv); 
    return $decrypt; 
} 


$password = encrypt($member[0]['PASSWORD']); 
print('Encrypted: '.$password.'<br />'); 
$password = decrypt($password); 
print('Decrypted: '.$password); 
+0

考虑使用[验证码](http://stackoverflow.com/questions/2448256/php- mcrypt-encrypting-decrypting-file/2448441#2448441)。这绝对是作品。 –

+1

这里有几个错误;您将字符串或密码视为键,您使用的Rijndael 256与* 256不相同,最后您没有明确定义明文的字符编码。这显然不包括我的答案中的IV问题。 –

+0

不幸的是,你必须欺骗mcrypt进入AES-256。就像使你的密码“MCRYPT_RIJNDAEL_128”一样,但给它一个256位的密钥。在PHP中字符编码也不容易控制,我不这么认为。尽管密码的东西完全正确。 –

回答

4

嗯,是的,这就是w ^当你使用随机IV进行加密和新进行解密时,会发生帽子。您只应在加密过程中生成IV将其前缀到密文。

2

问题出在$iv代。您在加密期间生成它,然后在解密期间再次生成它。

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); 

function encrypt($data, $iv) 
{ 
    $key = 'test'; 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv); 
    return $encrypted_data; 
} 

function decrypt($encryptedData, $iv) 
{ 
    $key = 'test'; 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv); 
    return $decrypt; 
} 

$password = encrypt("testing", $iv); 
echo $password.'<br>'; 
echo decrypt($password, $iv); 
+0

为什么迟到7分钟发布相同的答案? –

+0

我发布后检查了更新。我正在演示代码的小提琴。 :( – Achrome

+0

它看起来像一个很好的小提琴,所以解决这个具体问题,虽然通常加密和解密不会使用相同的实例。您需要以某种方式沟通IV。请注意,Stackoverflow喜欢有代码内联 - 不要只指向外面的小提琴,特别是如果它是一口大小的话。 –

-1

OK,我得到了加密与此代码的工作:

$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($size, MCRYPT_DEV_RANDOM); 

function encrypt($data) 
{ 
    $key = 'test'; 
    $encrypted_data = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $data, MCRYPT_ENCRYPT, $iv); 
    return base64_encode($encrypted_data); 
} 

function decrypt($encryptedData) 
{  
    $key = 'test'; 
    $encryptedData = base64_decode($encryptedData); 
    $decrypt = mcrypt_cbc(MCRYPT_RIJNDAEL_256, $key, $encryptedData, MCRYPT_DECRYPT, $iv); 
    return trim($decrypt); 
}