2013-03-25 76 views
1

我很苦惱PHP的mcrypt函數。我以前從來沒有使用過它們,並且它們在我的測試服務器(WAMP PHP 5.4.3)上正常工作,但它們在生產服務器(LAMP PHP 5.2.17)上隨機失敗。當我運行解密函數時,我得到如下的隨機(二進制?)字符:n/= C_ +` n{'a 6 Xh fEe41Omk7DjQ6/ n6leoTg ==。PHP mcrypt_decrypt隨機失敗

下面是加密和解密函數。這些來自我一直使用的nonce class

事情我已經嘗試:

  • 從兩者的功能
  • 移除靜脈輸液參數的類屬性創建加密功能的IV,存儲,然後使用該財產解密函數
  • 將加密輸出中的IV存儲爲described here

還有什麼我應該嘗試?

private function fnEncrypt($sValue) 
{ 
return trim(
    base64_encode(
    mcrypt_encrypt(
     MCRYPT_RIJNDAEL_256, 
     hash($this->hash, $this->secret, true), $sValue, 
     MCRYPT_MODE_ECB, 
     mcrypt_create_iv(
     mcrypt_get_iv_size(
      MCRYPT_RIJNDAEL_256, 
      MCRYPT_MODE_ECB 
     ), 
     MCRYPT_RAND 
    ) 
    ) 
) 
); 
} 

private function fnDecrypt($sValue) 
{ 
return trim(
    mcrypt_decrypt(
    MCRYPT_RIJNDAEL_256, 
    hash($this->hash, $this->secret, true), 
    base64_decode($sValue), 
    MCRYPT_MODE_ECB, 
    mcrypt_create_iv(
     mcrypt_get_iv_size(
     MCRYPT_RIJNDAEL_256, 
     MCRYPT_MODE_ECB 
    ), 
    MCRYPT_RAND 
    ) 
) 
); 
} 

回答

1

經過幾個小時的撞擊,我的頭靠在牆上,我意識到這個問題與mcrypt沒有任何關係。在輸出查詢字符串之前,我只需要加密字符串urlencode

這是導致部分加密字符串丟失,當我嘗試$_REQUEST加密的字符串稍後解密。這解釋了爲什麼失敗是隨機的,因爲它取決於加密字符串中的什麼「特殊」字符。