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 не является допустимым ресурсом MCrypt в E:\htdocs\site\application\lib\encryption.cls.php в строке 82
Предупреждение: mcrypt_generic_deinit(): 90 не является допустимым ресурсом MCrypt в E:\htdocs\site\application\lib\encryption.cls.php в строке 84
Предупреждение: mcrypt_module_close(): 90 не является допустимым ресурсом MCrypt в E:\htdocs\site\application\lib\encryption.cls.php в строке 85
(эти строки показаны в классе шифрования.)
и
ожидаемая расшифрованная строка (как при успешной дешифровке).
Я был бы признателен всем, кто мог бы указать, почему возникают предупреждения и почему это не влияет на результат.
PS любые комментарии по эффективности класса шифрования наиболее приветствуются.
Ответы
Ответ 1
он выглядит хорошо
<?php
$encryption = new \lib\Encryption( 'somekey' );
echo $encryption->decrypt(pack("H*", "4a4a564f26618d47536ff35b8a0af3212814a5f0ba635d2cf6f8cd31589042e2"));
_ch
потерянный beacuse mcrypt_module_close( $this->_ch );
в методе encrypt()
Возможно, вы можете изменить __construct
и сохранить только аргументы, просто создайте дескриптор (например, _ch
) при каждом зашифровании или расшифровке.
Я не очень хорош в Mcrypt, так что, может быть, немного тесто, чем у меня, но причина "действительной ресурса MCrypt" действительно mcrypt_module_close
Ответ 2
Похож на проблему с пространством имен, поскольку вы не префикс MCRYPT_MODE_ECB
в __construct()
.
Ответ 3
Это что-то проверить, но поскольку я не могу воспроизвести, не уверен, ответит ли он.
У вас есть SHA512 (создание ключа длины 512), но алгоритм ожидает 256 ключей длины. Не имеет значения, используете ли вы SHA256? Обычно несоответствие в ключах должно приводить к мусору, но в этом случае он все еще может работать "с побочными эффектами".