2013-02-05 40 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); 
}