2018年5月25日 星期五

【PHP】php實現 AES/CBC/PKCS5Padding 加密解密

最近在做一個API串接,對方是用JAVA寫的,

中間有要編碼的片段,編碼方式是AES (CBC模式) 轉 Base64,

我上網找了用下面方法加解密,
$encrypt = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $app_cc_aes_key, $data, MCRYPT_MODE_CBC, $app_cc_aes_iv);

用此方法可以順利解密,但是編碼後對方怎麼樣都解不開,

來回溝通搞了好久,上網爬文好久終於才找到解決方法,

原來是補碼的方式不同PHP是用ZeroPadding,JAVA是用PKCS5Padding,

※ 在PHP官網寫說關於mcrypt的function,PHP7.1之後不能使用!!

class AES {
 public $iv;

 public $encryptKey;

 //加密
 public function encrypt($encryptStr) {
  $localIV = $this->iv;
  $encryptKey = $this->encryptKey;

  $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);

  mcrypt_generic_init($module, $encryptKey, $localIV);

  $block = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
  $pad = $block - (strlen($encryptStr) % $block); 
  $encryptStr .= str_repeat(chr($pad), $pad); 

  $encrypted = mcrypt_generic($module, $encryptStr);

  mcrypt_generic_deinit($module);
  mcrypt_module_close($module);

  return base64_encode($encrypted);
 }

 //解密
 public function decrypt($encryptStr) {
  $localIV = $this->iv;
  $encryptKey = $this->encryptKey;

  $module = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, $localIV);

  mcrypt_generic_init($module, $encryptKey, $localIV);

  $encryptedData = base64_decode($encryptStr);
  $encryptedData = mdecrypt_generic($module, $encryptedData);

  return $encryptedData;
 }
}

沒有留言:

張貼留言