2012-05-14 17 views
13

que tengo un poco de una extraña en esta clase:advertencia mcrypt pero aún descifra los datos

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

cuando se llama a este modo:

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

echo $encryption->decrypt($safeInfo); 

rendimientos estrangular:

Advertencia: mdecrypt_generic(): 90 no es un recurso de MCrypt válido en E: \ htdocs \ sitio \ aplicación \ lib \ encryption.cls.php en la línea 82

Advertencia: mcrypt_generic_deinit(): 90 no es un recurso de MCrypt válido en E: \ htdocs \ sitio \ aplicación \ lib \ encryption.cls.php en la línea 84

Advertencia: mcrypt_module_close(): 90 no es una MCrypt válida de recursos en E: \ htdocs \ sitio \ application \ lib \ encryption.cls.php en la línea 85

(. estas líneas se muestran en la clase de cifrado)

Y

la cadena descifrada esperado (como en desencriptado con éxito).

Le agradecería a cualquiera que pueda señalar por qué las advertencias se plantean y por qué no parece afectar el resultado.

PS cualquier comentario sobre la eficacia de la clase de encriptación más bienvenida.

+0

¿Cuál es el valor de '$ this -> _ ch'? – jeroen

+0

var_dump ($ this -> _ ch) yields resource (90, mcrypt) –

+0

Intenté ejecutar el script tanto en Linux como en Windows. No recibí ninguna advertencia. Me aseguré de activar todos los errores también. No pude reproducir el mismo resultado. Si llamo mycrypt_module_close primero, mostraría las advertencias, pero no las descifraría. – Gohn67

Respuesta

5

se ve bien

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

_ch perdido por culpa mcrypt_module_close($this->_ch); en el método encrypt()

Tal vez se puede cambiar __construct y guardar args solamente, apenas crear mango (como _ch) al cifrar o descifrar cada vez.

No soy bueno en Mcrypt, así que tal vez alguna manera bateador que la mía, pero la razón del problema "válido recursos MCrypt" es verdaderamente mcrypt_module_close

+0

¿Solo el hecho de que 'mcrypt_module_close' está ahí? No se llama hasta que se haya completado/descifrado y nunca se haya invocado el mismo objeto, por lo que no se puede codificar ni descodificar en la misma instancia ... –

+1

Si cifras seguido de descifrado, recibirás las advertencias, pero no imprime el resultado correcto. Creo que se detiene antes de que pueda descifrar. Pude reproducir las advertencias y el resultado correcto solo fue invocar el descifrado dos veces seguidas hasta el momento. La cadena correcta aparece primero, luego las advertencias. – Gohn67

2

Esto es algo para ver, pero como no puedo reproducir , no estoy seguro de si es la respuesta.

Tiene SHA512 (creando una clave de longitud 512) pero el algoritmo está esperando una clave de 256 longitudes. ¿Hay alguna diferencia si usas SHA256? Normalmente, una falta de coincidencia en las claves debería producir basura, pero en este caso aún puede estar funcionando "con efectos secundarios".

+0

No, no importa en este caso, ya que la función substr se encarga de eso; se asegurará de que la longitud de la clave sea la adecuada. –

3

Parece un problema de espacio de nombres ya que no prefijiste MCRYPT_MODE_ECB en __construct().

+0

Esto no es un problema en este caso ya que no usó 'use some_namespace', por lo que la clase todavía está en el espacio de nombres global, por lo que' MCRYPT_MODE_ECB' funciona sin un '\'. Sin embargo, podría estar equivocado. No estoy completamente familiarizado con los espacios de nombres en php. – Gohn67

Cuestiones relacionadas