2013-07-22 63 views
5

Tôi đang viết một lớp để xử lý dữ liệu được mã hóa, về cơ bản nó sẽ được sử dụng để mã hóa dữ liệu được lưu trữ trong DB và sau đó lại giải mã nó khi truy xuất.các vấn đề đang cố gắng để mở openssl_encrypt để làm việc

Dưới đây là những gì tôi đã viết:

class dataEncrypt { 

     private $encryptString; 
     private $decryptString; 
     private $encryptionMethod; 
     private $key; 

     public function __construct() { 

      /* IMPORTANT - DONT CHANGE OR DATA WILL DAMAGE */ 
      $this->key = sha1('StringToHash'); 

      // Set the encryption type 
      $this->encryptionMethod = "AES-256-CBC"; 

     } 

     // Generate the IV key 
     private function generateIV() { 

      $ivSize = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); 
      return mcrypt_create_iv($ivSize, MCRYPT_RAND); 
     } 

     // Retrieve the key 
     private function retrieveKey() { 

      return $key; 
     } 

     // Encrypt a string 
     public function encryptString($string) { 

      // Return the encrypted value for storage 
      return openssl_encrypt($string, $this->encryptionMethod, $this->retrieveKey(), 0, $this->generateIV()); 
     } 

     // Decrypt a string 
     public function decryptString($data) { 

      // return the decrypted data 
      return openssl_decrypt($data, $this->encryptionMethod, $this->retrieveKey(), 0, $this->generateIV()); 

      return false; 

     } 

    } 

Tôi đang cố gắng để mã hóa một chuỗi trước khi lưu trữ, và tôi nhận được cảnh báo PHP sau:

Cảnh báo: openssl_encrypt(): IV đã vượt qua dài 32 byte dài hơn 16 byte được mong đợi bằng mật mã đã chọn, cắt ngắn trong/var/www/blahblah ... trên dòng xxx

Tôi đã googled điều này, đã googled IV chức năng, tôi không thể tìm thấy sweetheat trên một trong hai. Mọi lời khuyên đều được hoan nghênh ở đây.

Cảm ơn

+0

Mã của bạn không thể nào làm việc. Bạn cần truyền IV cùng với bản mã. – SLaks

+0

tôi đã thay đổi nó như thế này: \t \t // Mã hóa một chuỗi \t \t public function encryptString ($ string) { \t \t \t $ ivSize = mcrypt_get_iv_size (MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC); \t \t \t $ iv = mcrypt_create_iv ($ ivSize, MCRYPT_RAND); \t \t \t // Trả về giá trị được mã hóa để lưu trữ \t \t \t trở openssl_encrypt ($ string, $ this-> encryptionMethod, $ this-> retrieveKey(), 0, $ iv); \t \t} \t \t Nhưng tôi vẫn gặp lỗi tương tự? Tôi không biết phải làm gì và tài liệu bên cạnh không tồn tại ... – ThePHPUnicorn

+0

nó phải là cảnh báo 'MCRYPT_RIJNDAEL_128' – CIRCLE

Trả lời

10

tôi đã có thể để có được nó làm việc bằng cách đi qua MCRYPT_CAST_256 hơn MCRYPT_RIJNDAEL_256 vào mcrypt_get_iv_size

Encrypt:

$iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC); 
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND); 

$encrypted = openssl_encrypt($string, "AES-256-CBC", $key, 0, $iv); 
$encrypted = $iv.$encrypted; 

Decrypt

$iv_size = mcrypt_get_iv_size(MCRYPT_CAST_256, MCRYPT_MODE_CBC); 
$iv = substr($string, 0, $iv_size); 

$decrypted = openssl_decrypt(substr($string, $iv_size), "AES-256-CBC", $key, 0, $iv); 
+1

! KHÔNG sử dụng các hàm mcrypt_ * cùng với các hàm openssl_ *! Đối với một, mcrypt_ * là từ bỏ, không được chấp nhận trong PHP 7.1 và sẽ được loại bỏ trong PHP 7.2. Cập nhật mã của bạn để chỉ sử dụng openssl_ * hoặc libsodium. –

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