mcrypt警告但仍解密数据

时间:2012-05-14 14:07:09

标签: php mcrypt

我在这堂课中有点奇怪:

<?php
namespace lib;

/**
 * Short description of Crypt
 *
 * @author xxxx
 * @package
 */
class Encryption
{
    /**
     * Short description of _ch
     * handle to the mcrypt resource
     *
     * @access private
     * @var $_ch
     */
    private $_ch;

    /**
     * Short description of __construct
     *
     * @access public
     * @author xxxx
     * @param
     * @return void
     */
    public function __construct( $keyData = NULL, $algorithm = \MCRYPT_RIJNDAEL_256, $mode = MCRYPT_MODE_ECB, $encLibPath = '', $modeDir = '' )
    {
        $this->_ch = mcrypt_module_open( $algorithm, $encLibPath, $mode, $modeDir );

        $vector  = mcrypt_create_iv ( mcrypt_enc_get_iv_size( $this->_ch ), \MCRYPT_DEV_URANDOM );
        $keySize = mcrypt_enc_get_key_size( $this->_ch );

        $key = substr( hash( 'SHA512', $keyData . $keySize ), 0, $keySize );

        $x = mcrypt_generic_init( $this->_ch, $key, $vector );
    }

    /**
     * Short description of encrypt
     *
     * @access public
     * @author xxxx
     * @param String $str
     * @return String $res
     */
    public function encrypt( $str )
    {
        if( !is_string( $str ) )
        {
            throw new \InvalidArgumentException( 'Attemptig to encrypt data that is not a string' );
            return false;
        }
        $res = mcrypt_generic( $this->_ch, $str );

        mcrypt_generic_deinit( $this->_ch );
        mcrypt_module_close( $this->_ch );

        #var_dump($str,$res);
        return $res;
    }

    /**
     * Short description of decrypt
     *
     * @access public
     * @author xxxx
     * @param String $str
     * @return String $res
     */
    public function decrypt( $str )
    {
        if( !is_string( $str ) )
        {
            throw new \InvalidArgumentException( 'Attemptig to decrypt data that is not a string' );
            return false;
        }

82      $res = mdecrypt_generic( $this->_ch, $str );

84      mcrypt_generic_deinit( $this->_ch );
85      mcrypt_module_close( $this->_ch );

        #var_dump($str,$res);
        return trim( $res);
    }
}

当这样调用时:

<?php
$encryption    = new \lib\Encryption( 'somekey' );

echo $encryption->decrypt( $safeInfo );

扼杀收益率:

警告:mdecrypt_generic():90不是第82行的E:\ htdocs \ site \ application \ lib \ encryption.cls.php中的有效MCrypt资源

警告:mcrypt_generic_deinit():90不是第84行E:\ htdocs \ site \ application \ lib \ encryption.cls.php中的有效MCrypt资源

警告:mcrypt_module_close():90不是第85行E:\ htdocs \ site \ application \ lib \ encryption.cls.php中的有效MCrypt资源

(这些行显示在加密类中。)

预期的解密字符串(如成功解密)。

我会感激任何可能指出为什么警告会被提出以及为什么它似乎不会影响结果的人。

PS对加密类有效性的任何评论都是最受欢迎的。

3 个答案:

答案 0 :(得分:5)

看起来很好

<?php
$encryption = new \lib\Encryption( 'somekey' );
echo $encryption->decrypt(pack("H*", "4a4a564f26618d47536ff35b8a0af3212814a5f0ba635d2cf6f8cd31589042e2"));

_ch在方法mcrypt_module_close( $this->_ch );

中丢失了encrypt()

也许您可以更改__construct并仅保存args,只需在每次加密或解密时创建句柄(如_ch)。

我不擅长Mcrypt,所以也许比我的方式更好,但“有效的MCrypt资源”问题的原因是真的mcrypt_module_close

答案 1 :(得分:3)

看起来像名称空间问题,因为您没有MCRYPT_MODE_ECB中的__construct()前缀。

答案 2 :(得分:2)

这是要检查的东西,但由于我无法复制,不确定它是否是答案。

你有SHA512(创建一个512长度的密钥),但是algorythm期望一个256长度的密钥。如果你使用SHA256会有什么不同吗?通常情况下,密钥不匹配会产生垃圾,但在这种情况下,它可能仍然在“有副作用”。