2012-05-14 25 views
13

Tôi có một chút của một ai lạ trong lớp này:cảnh báo Mcrypt nhưng vẫn giải mã dữ liệu

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

khi gọi này như sau:

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

echo $encryption->decrypt($safeInfo); 

siết lãi suất:

Cảnh báo: mdecrypt_generic(): 90 không phải là tài nguyên MCrypt hợp lệ trong E: \ htdocs \ site \ application \ lib \ encrypt.cls.php trên dòng 82

Cảnh báo: mcrypt_generic_deinit(): 90 không phải là tài nguyên MCrypt hợp lệ trong E: \ htdocs \ site \ application \ lib \ encrypt.cls.php trên dòng 84

Cảnh báo: mcrypt_module_close(): 90 không phải là một MCrypt hợp lệ tài nguyên trong E: \ htdocs \ site \ ứng dụng \ lib \ encryption.cls.php trên đường dây 85

(. những dòng này được trình bày trong lớp mã hóa)

dự kiến ​​chuỗi giải mã (như trong giải mã thành công).

Tôi sẽ biết ơn bất cứ ai có thể chỉ ra lý do tại sao các cảnh báo được nêu ra và tại sao nó dường như không ảnh hưởng đến kết quả.

PS bất kỳ nhận xét nào về hiệu quả của lớp mã hóa được chào đón nhiều nhất.

+0

Giá trị của '$ this -> _ ch' là gì? – jeroen

+0

var_dump ($ this -> _ ch) tạo ra tài nguyên (90, mcrypt) –

+0

Tôi đã thử chạy tập lệnh của bạn trên cả Linux và Windows. Tôi không nhận được bất kỳ cảnh báo nào. Tôi chắc chắn đã bật tất cả các lỗi. Tôi không thể tái tạo cùng một kết quả. Nếu tôi gọi mycrypt_module_close trước, sau đó nó sẽ hiển thị các cảnh báo, nhưng không giải mã được. – Gohn67

Trả lời

5

nó trông cũng

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

_ch mất beacuse mcrypt_module_close($this->_ch); trong phương pháp encrypt()

lẽ bạn có thể thay đổi __construct và lưu args chỉ, chỉ cần tạo xử lý (như _ch) khi bạn mã hóa hoặc giải mã mỗi lần.

Tôi không giỏi Mcrypt, vì vậy có thể một số cách bột hơn tôi, nhưng lý do của "tài nguyên Mcrypt hợp lệ" Vấn đề thực sự là mcrypt_module_close

+0

Thực tế là 'mcrypt_module_close' có ở đó không? Nó không được gọi cho đến sau khi en/giải mã được thực hiện và nó không bao giờ được gọi trên cùng một đối tượng, do đó bạn không thể mã hóa và giải mã trong cùng một thể hiện ... –

+1

Nếu bạn thực hiện mã hóa theo sau giải mã, bạn sẽ nhận được cảnh báo, nhưng không in kết quả chính xác. Tôi nghĩ nó dừng lại trước khi nó có thể giải mã. Tôi đã có thể tái tạo các cảnh báo và kết quả chính xác chỉ được gọi là giải mã hai lần liên tiếp cho đến nay. Chuỗi chính xác xuất hiện đầu tiên, sau đó là cảnh báo. – Gohn67

2

Đây là một cái gì đó để kiểm tra, nhưng như tôi không thể tái tạo , không chắc đó có phải là câu trả lời hay không.

Bạn có SHA512 (tạo khóa có chiều dài 512) nhưng dấu algorythm đang mong chờ khóa có chiều dài 256. Nó có tạo nên sự khác biệt nào nếu bạn sử dụng SHA256 không? Thông thường một sự không phù hợp trong các khóa sẽ tạo ra rác, nhưng trong trường hợp này nó vẫn có thể hoạt động "với các tác dụng phụ".

+0

Không có vấn đề gì trong trường hợp này vì hàm substr quan tâm đến điều đó - nó sẽ đảm bảo độ dài của khóa là thích hợp. –

3

Có vẻ như vấn đề về không gian tên vì bạn không có tiền tố MCRYPT_MODE_ECB trong __construct().

+0

Điều đó hóa ra không phải là một vấn đề trong trường hợp này vì anh ta không sử dụng 'use somenamnamace', vì vậy lớp đó vẫn còn trong không gian tên toàn cục, đó là lý do tại sao' MCRYPT_MODE_ECB' hoạt động mà không có '\'. Tôi có thể sai mặc dù. Tôi không hoàn toàn quen thuộc với không gian tên trong php. – Gohn67

Các vấn đề liên quan