2013-07-22 66 views
5

我正在編寫一個類來處理加密數據,本質上它將用於加密要存儲在數據庫中的數據,然後在檢索時再解密它。試圖讓openssl_encrypt工作的問題

下面是我寫的東西:

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; 

     } 

    } 

我想在存儲之前爲字符串加密,我也得到了以下PHP警告:

警告:openssl_encrypt():IV通過長32個字節,這比選擇密碼,截斷在/ var/WWW/blahblah預計16長...在線XXX

我GOOGLE了這一點,香港專業教育學院的一派IV功能,我也無法找到甜心。任何意見都歡迎在這裏。

感謝

+0

您的代碼不可能工作。您需要將IV與密文一起傳輸。 – SLaks

+0

我改成了這一點: \t \t //加密的字符串\t \t公共函數encryptString($串){ \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 //返回的加密值存儲 \t \t \t返回openssl_encrypt($字符串,$這 - > encryptionMethod,$這 - > retrieveKey(),0,$ⅳ); \t \t} \t \t 但我仍然得到相同的錯誤?我不知道該怎麼辦,文件旁邊不存在... – ThePHPUnicorn

+0

它必須是'MCRYPT_RIJNDAEL_128' – CIRCLE

回答

10

我能得到它的工作通過傳遞MCRYPT_CAST_256而不是MCRYPT_RIJNDAEL_256到mcrypt_get_iv_size

加密:

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

解密

$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

警告!不要使用mcrypt_ *函數和openssl_ *函數!首先,mcrypt_ *是棄用軟件,在PHP 7.1中棄用,在PHP 7.2中將被移除。更新您的代碼以僅使用openssl_ *或libsodium。 –