2012-05-14 8 views
13

Mam trochę dziwne jeden w tej klasie:ostrzeżenie mcrypt ale nadal odszyfrowuje dane

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

Dzwoniąc to tak:

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

echo $encryption->decrypt($safeInfo); 

plony udusić:

Warning: mdecrypt_generic(): 90 nie jest prawidłowym zasobem MCrypt w E: \ htdocs \ site \ application \ lib \ encryption.cls.php na linii 82

Uwaga: mcrypt_generic_deinit() 90 nie jest ważne źródło MCrypt E: \ htdocs \ \ miejscu aplikacji \ lib \ encryption.cls.php na linii 84

Uwaga: mcrypt_module_close() 90 nie jest ważne MCrypt zasobów w E: \ htdocs \ site \ Application \ lib \ encryption.cls.php na linii 85

(. linie te są przedstawione w klasie szyfrowania)

I

oczekiwany rozszyfrował string (jak w pomyślnym odszyfrowaniu).

Byłbym wdzięczny każdemu, kto mógłby wskazać, dlaczego ostrzeżenia są zgłaszane i dlaczego nie wpływają one na wynik.

PS wszelkie komentarze na temat skuteczności klasy szyfrowania najbardziej pożądane.

+0

Jaka jest wartość '$ this -> _ ch'? – jeroen

+0

var_dump ($ this -> _ ch) dostarcza zasobów (90, mcrypt) –

+0

Próbowałem uruchomić twój skrypt zarówno w systemie Linux, jak i Windows. Nie otrzymałem żadnych ostrzeżeń. Upewniłem się, że wszystkie błędy też się pojawią. Nie mogłem odtworzyć tego samego wyniku. Jeśli najpierw zadzwonię do mycrypt_module_close, to pokaże ostrzeżenia, ale nie odszyfruje. – Gohn67

Odpowiedz

5

to dobrze wygląda

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

_ch utraconą beacuse mcrypt_module_close($this->_ch); w metodzie encrypt()

Może zmienić __construct i zapisać args tylko, wystarczy utworzyć uchwyt (jak _ch) podczas szyfrowania i deszyfrowania za każdym razem.

Nie jestem dobry w mcrypt, więc może jakiś sposób ciasto niż moje, ale powodem „ważny zasobów MCrypt” problem jest naprawdę mcrypt_module_close

+0

Tylko fakt, że 'mcrypt_module_close' istnieje? Nie jest wywoływana dopóki nie zostanie wykonana en/deszyfracja i nigdy nie wywołuje tego samego obiektu, więc nie można kodować i dekodować w tym samym wystąpieniu ... –

+1

Jeśli zaszyfrujesz, a następnie odszyfrujesz, otrzymasz ostrzeżenia, ale nie wydrukuj poprawny wynik. Myślę, że zatrzymuje się, zanim będzie można odszyfrować. Udało mi się odtworzyć ostrzeżenia, a poprawny wynik wywoływał tylko dwukrotne odszyfrowywanie z rzędu. Właściwy ciąg pojawia się najpierw, a następnie ostrzeżenia. – Gohn67

2

To jest coś, by sprawdzić, ale nie mogę odtworzyć , nie jestem pewien, czy to jest odpowiedź.

Masz SHA512 (tworzenie klucza długości 512), ale algorytm oczekuje klucza o długości 256. Czy robi to jakąś różnicę, jeśli używasz SHA256? Zwykle niedopasowanie klawiszy powinno generować śmieci, ale w tym przypadku nadal może działać "z efektami ubocznymi".

+0

Nie ma to znaczenia w tym przypadku, ponieważ funkcja substr dba o to - upewni się, że długość klucza jest odpowiednia. –

3

Wygląda na to, że problem z przestrzenią nazw nie był poprzedzony prefiksem MCRYPT_MODE_ECB w __construct().

+0

To nie jest problem w tym przypadku, ponieważ nie używał 'use some_namespace', więc klasa nadal znajduje się w globalnej przestrzeni nazw, dlatego' MCRYPT_MODE_ECB' działa bez '\'. Mogę się mylić. Nie jestem w pełni zaznajomiony z przestrzeniami nazw w php. – Gohn67

Powiązane problemy