2013-03-25 53 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加密的字符串稍后解密。这解释了为什么失败是随机的,因为它取决于加密字符串中的什么“特殊”字符。