2012-07-18 272 views
0

我正在研究一個簡單的Zend應用程序,我需要先加密所有財務數據,然後再將它們存儲在數據庫中,並在需要時將其解密。我用mcrypt_encrypt()mcrypt_decrypt()。由於我需要解密數字,我使用了一個常量初始化向量(iv),這並不是建議的。mcrypt_decrypt無法正常工作

這裏是我的代碼:

define ('string','WdryhedeescmsfkirYNemsjdesapQ'); 
define ('iv', '$356?dWuSkm)@g%dnw#8mA*'); 

class FormatValues { 

const string= 'WdryhedeescmsfkirYNemsjdesapQ'; 
const iv = '$356?dWuSkm)@g%dnw#8mA*'; 

public function encrypt($val){ 
    $enc = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $val,self::string , MCRYPT_MODE_CBC,self::iv); 
    return $enc; 
} 

public function decrypt($val){ 
    $dec = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $val,self::string , MCRYPT_MODE_CBC,self::iv), "\0"); 
    return $dec; 

} 
} 

encrypt()方法對數據進行加密,解密,但時,它並沒有給出正確的數字。

這是爲什麼?有沒有其他方式來加密和解密數據,而不是一個常數iv?

在此先感謝

Charu

+1

在什麼樣的字段你存儲這些數據在數據庫中?您應該使用'VARBINARY'或'BLOB'字段,如果不是,請確保您從數據庫檢索到的字符串與您插入的字符串相同。 – DaveRandom 2012-07-18 09:54:21

+0

謝謝!!我認爲問題在那裏! :-) – 2012-07-18 09:57:03

回答

4

我爲我的項目使用類似的東西,試試吧!

$key = 'password to (en/de)crypt'; 
$string = ' string to be encrypted '; // note the spaces 

$encrypted = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key)))); 
$decrypted = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($encrypted), MCRYPT_MODE_CBC, md5(md5($key))), "\0"); 

echo 'Encrypted:' . "\n"; 
var_dump($encrypted); 

echo "\n"; 

echo 'Decrypted:' . "\n"; 
var_dump($decrypted); // spaces are preserved 
+0

的名稱,謝謝......此作品..... – 2012-07-18 10:02:15

+0

不客氣! – 2012-07-18 10:03:39

+0

好而強:) – user2511140 2014-10-22 18:47:00

0

不知道這是否是正確的答案,但是,因爲它是在PHP中的保留關鍵字,你絕對不應該定義一個名爲string不變。

+0

這是一個好點,但肯定是一個評論,而不是一個答案。 – DaveRandom 2012-07-18 09:52:03

+0

@Geoffrey Brier非常感謝您的評價......我將更改常量 – 2012-07-18 09:58:45