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