1

我正在努力使用 PHP 的 mcrypt 函数。我以前从未使用过它们,它们在我的测试服务器(WAMP PHP 5.4.3)上运行良好,但它们在生产服务器(LAMP PHP 5.2.17)上随机失败。当我运行解密函数时,我得到如下随机(二进制?)字符:n��/�=�C_����+`�n{'a��6�Xh��fEe41Omk7DjQ6/n6leoTg==。

下面是加密和解密函数。这些来自我一直在使用的nonce 类。

我尝试过的事情:

  • 从两个函数中删除 IV 参数
  • 在加密函数中创建一个 IV,存储在类属性中,然后在解密函数中使用该属性
  • 如此处所述,将IV 存储在加密输出中。

还有什么我应该尝试的吗?

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
    )
  )
);
}
4

1 回答 1

1

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

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

于 2013-03-25T01:52:45.703 回答