2013-07-22 24 views
5

Piszę klasę do obsługi zaszyfrowanych danych, w zasadzie będzie ona używana do szyfrowania danych, które mają być przechowywane w DB, a następnie do odszyfrowania ich przy pobieraniu.problemy z uzyskaniem openssl_encrypt do pracy

Oto co mam napisane:

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; 

     } 

    } 

Usiłuję zaszyfrować ciąg przed przechowywania i otrzymuję następujące ostrzeżenie PHP:

Warning: openssl_encrypt(): IV przekazywane jest 32 bajtów, który jest dłuższy niż 16 oczekiwanej przez wybranego szyfru, obcinanie w/var/www/blahblah ... na linii xxx

mam google to, Ive googled IV funkcje, nie mogę znaleźć sweetheat na obu. Wszelkie rady są tutaj mile widziane.

Dzięki

+0

Twój kod nie może pracować. Musisz przekazać IV wraz z zaszyfrowanym tekstem. – SLaks

+0

Zmieniłem go w ten sposób: \t \t // Szyfrowanie ciąg \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 // Zwraca wartość zaszyfrowanego przechowywania \t \t \t powrót openssl_encrypt ($ string, $ this-> encryptionMethod, $ this-> retrieveKey(), 0, $ iv); \t \t} \t \t Ale nadal mam ten sam błąd? Nie wiem, co robić, a dokumentacja jest bliska nieistniejącej ... – ThePHPUnicorn

+0

musi to być 'MCRYPT_RIJNDAEL_128' – CIRCLE

Odpowiedz

10

udało mi się dostać pracę przekazując MCRYPT_CAST_256 zamiast MCRYPT_RIJNDAEL_256 do mcrypt_get_iv_size

Szyfrowanie:

$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; 

Deszyfruj

$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

Ostrzeżenie! NIE używaj funkcji mcrypt_ * wraz z funkcjami openssl_ *! Po pierwsze, mcrypt_ * to abandonware, przestarzałe w PHP 7.1 i zostanie USUNIĘTE w PHP 7.2. Zaktualizuj swój kod, aby używać tylko plików openssl_ * lub libsodium. –

Powiązane problemy