【问题标题】:mcrypt warningsmcrypt 警告
【发布时间】:2012-10-26 03:12:19
【问题描述】:

我不断收到这些警告:

警告:mcrypt_generic_init(): mcrypt_generic_init(): 1 不是 C:\Users\dever\Desktop\web 中的有效 MCrypt 资源 code\HeloWorld\HeloWorld\Crypt.php 位于第 123 行,第 9 列。

警告:mdecrypt_generic(): mdecrypt_generic(): 1 无效 C:\Users\dever\Desktop\web 中的 MCrypt 资源 code\HeloWorld\HeloWorld\Crypt.php 位于第 124 行,第 9 列。

警告:mcrypt_generic_deinit(): mcrypt_generic_deinit(): 1 不是 C:\Users\dever\Desktop\web 中的有效 MCrypt 资源 code\HeloWorld\HeloWorld\Crypt.php 位于第 125 行,第 9 列。

警告:mcrypt_generic_init(): mcrypt_generic_init(): 1 不是 C:\Users\dever\Desktop\web 中的有效 MCrypt 资源 code\HeloWorld\HeloWorld\Crypt.php 位于第 100 行,第 9 列。

警告:mcrypt_generic(): mcrypt_generic(): 1 不是有效的 MCrypt C:\Users\dever\Desktop\web 中的资源 code\HeloWorld\HeloWorld\Crypt.php 位于第 105 行,第 9 列。

警告:mcrypt_generic_deinit(): mcrypt_generic_deinit(): 1 不是 C:\Users\dever\Desktop\web 中的有效 MCrypt 资源 code\HeloWorld\HeloWorld\Crypt.php 位于第 107 行,第 9 列。

因为它是一个警告并且字符串“似乎”被加密了,所以我一直忽略它直到现在。但是,我正在使用的远程服务器似乎不喜欢加密字符串并向我返回错误说明。

这是生成这些警告的代码:

    mcrypt_generic_init($this->_td, $this->_key, $iv);
    $data = mdecrypt_generic($this->_td, $data);
    mcrypt_generic_deinit($this->_td);

$iv = mcrypt_create_iv(self::AES_BLOCK_SIZE, $random_source);
    $s = mcrypt_generic_init($this->_td, $this->_key, $iv);
    if( ($s < 0) || ($s === false))
        die( "Really an error" );
    $data = mcrypt_generic($this->_td, $data);
    $data = $iv.$data;
    mcrypt_generic_deinit($this->_td);

我进行了研究,但无法找出这些警告的含义,它们是否影响加密/解密或究竟是什么问题?我很确定它不是代码(因为我让它在不同的服务器上工作)。

【问题讨论】:

  • 显然,$this-&gt;_td 不是有效的 MCrypt 资源,正如错误消息告诉您的那样。您必须展示如何初始化 $this-&gt;_td
  • $this->_td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', 'cbc', '');那么1代表第一个参数?
  • 不,1 是通过 $this-&gt;_td 变量传入的。
  • 在您的mcrypt_module_open 之后添加var_dump($this-&gt;_td);如果mcrypt_module_open 失败,它应该打印类似Resource id #15bool(false) 的内容。 如果你得到一个资源id,在你调用mcrypt_generic_init($this-&gt;_td, ...之前添加另一个var_dump($this-&gt;_td)并检查它是否显示相同的资源id。如果它不同,您将在某处用垃圾覆盖您的$this-&gt;_td
  • resource(3) 类型 (mcrypt) - 打开后 |类型(未知)的资源(3) - 在初始化调用之前。所以我猜这是一个覆盖,但我没有看到 $this->_td = 在构造函数中调用 mcrypt_module_open 的任何地方

标签: php mcrypt


【解决方案1】:

这是我执行的测试,它重现了您在 var_dumps 中看到的值:

$td = mcrypt_module_open(MCRYPT_DES, '', MCRYPT_MODE_ECB, '/usr/lib/mcrypt-modes');
var_dump($td);
mcrypt_module_close($td);
var_dump($td);

打印出来:

resource(4) of type (mcrypt)
resource(4) of type (Unknown)

由于您看到相同的行为(资源 ID 保持不变,但失去了其 mcrypt 关联),您似乎在初始化 $this-&gt;_td 和实际调用 @987654326 之间的某个时间点关闭了模块资源@。

【讨论】:

    猜你喜欢
    • 2014-03-22
    • 2010-10-27
    • 2018-01-08
    • 2012-12-09
    • 2018-06-30
    • 2023-01-16
    • 2015-05-10
    • 2017-05-31
    • 1970-01-01
    相关资源
    最近更新 更多