PHP mcrypt_decrypt随机失败

时间:2013-03-25 00:14:55

标签: php encryption mcrypt

我正在努力使用PHP的mcrypt函数。我之前从未使用它们,它们在我的测试服务器上工作正常(WAMP PHP 5.4.3),但它们在生产服务器上随机失败(LAMP PHP 5.2.17)。当我运行decrypt函数时,我得到随机(二进制?)字符,如下所示:n / = C_ +` n{'a 6 Xh fEe41Omk7DjQ6/ n6leoTg ==。< / p>

以下是加密和解密功能。这些来自我一直在使用的nonce class

我尝试过的事情:

  • 从两个函数中删除IV参数
  • 在加密函数中创建一个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 个答案:

答案 0 :(得分:1)

经过几个小时的撞击我的头撞墙,我意识到问题与mcrypt没有任何关系。在将其输出到查询字符串之前,我只需要urlencode加密的字符串。

当我稍后尝试$_REQUEST加密字符串进行解密时,这会导致部分加密字符串丢失。这解释了为什么失败是随机的,因为它取决于加密字符串中出现的“特殊”字符。