如何将JAVA的aesKey加密转换成PHP

本篇博文为大家讲诉如何将JAVA的aesKey加密转换成PHP

     之前博主遇到了一个需求,需要调用银行的一个接口,其中涉及到aesKey加密跟解密的问题,虽然有DEMO,但无奈是JAVA版本的,而博主的环境的PHP,所以碰壁了好久终于调通,所以将为大家分享如何实现转换。

     首先看下JAVA版本的:

加密方法:
 
public class TenpayEncryptionUtils {
 public static String encrypt(String data,String type) {
  String md5Key = CommUtils.getConfig(type+"_MD5KEY");
  String aesKey = CommUtils.getConfig(type+"_AESKEY");
  try {
   data = URLEncoder.encode(data,"utf-8");
  } catch (UnsupportedEncodingException e) {
   data = null;
  }
  if(data != null){
   String aesStr = EncryptionUtils.encrypt(data, aesKey);
   String md5Str = EncryptionMD5.encodeByMd5(aesStr+md5Key);
   JSONObject json=new JSONObject();
   json.put("data", aesStr);
   json.put("sign", md5Str);
   return json.toString();
  }
 
  return null;
    }
 
    public static String decrypt(String data, String sign,String type) {
     String md5Key = CommUtils.getConfig(type+"_MD5KEY");
  String aesKey = CommUtils.getConfig(type+"_AESKEY");
  if(!EncryptionMD5.encodeByMd5(data + md5Key).equals(sign)){
   return null;
  }
  String decodedData = EncryptionUtils.decrypt(data, aesKey);
  try {
   decodedData =  URLDecoder.decode(decodedData, "UTF-8");
  } catch (UnsupportedEncodingException e) {
   decodedData = null;
  }
  return decodedData;
     }
 
字符转成字节,然后加密:
 
public class EncryptionUtils {
 public static String encrypt(String content, String key) {
  if(!checkKey(key)){
      return null;
     }
        try {
            Cipher aesECB = Cipher.getInstance("AES/ECB/PKCS5Padding");
            SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
            aesECB.init(Cipher.ENCRYPT_MODE, secretKey);
            byte[] result = aesECB.doFinal(content.getBytes("UTF-8"));
            return Hex.encodeHexString(result);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  }
        return null;
    }
 
    public static String decrypt(String content, String key) {
     if(!checkKey(key)){
      return null;
     }
         try {
             Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");// 创建密码器
             SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "AES");
             cipher.init(Cipher.DECRYPT_MODE, secretKey);// 初始化
             byte[] contentBytes = Hex.decodeHex(content.toCharArray());
             return new String(cipher.doFinal(contentBytes)); // 解密
         } catch (NoSuchAlgorithmException e) {
             e.printStackTrace();
         } catch (NoSuchPaddingException e) {
             e.printStackTrace();
         } catch (InvalidKeyException e) {
             e.printStackTrace();
         } catch (IllegalBlockSizeException e) {
             e.printStackTrace();
         } catch (BadPaddingException e) {
             e.printStackTrace();
         } catch (DecoderException e) {
   e.printStackTrace();
  }
         return null;
     }
    
    private static boolean checkKey(String key){
     if(key == "" || key.length() < 6){
      return false;
     }
     return true;
    }
}

      下面是PHP版本的:

///////////////////      根据data进行aesKey加密后获得sign      ///////////////////

/**
 * aesKey加密
 * @param array $dataParams
 * @return array|string
 */
static function orderEncryption($dataParams = array())
{
    //数组转成Json方法【防止中文乱码】
    $dataParams = self::__jsonToUtf8($dataParams);
    //URLEncode进行转换防止中文乱码
    $dataParams = urlencode($dataParams);
    //AES加密
    $dataParams = self::encrypt($dataParams, 'jfdshfjdsfhjytgb');
    //将AES加密后的字符串再加上MD5KEY后再MD5加密
    $md5Key = "123456";
    $dataParams = md5($dataParams . $md5Key);
    //返回json
    return $dataParams;
}

/**
 * 对数组进行json编码,防止中文乱码
 * @param $testJSON
 * @return string
 */
static function __jsonToUtf8($testJSON)
{
    foreach ($testJSON as $key => $value) {
        $testJSON[$key] = urlencode($value);
    }
    return urldecode(json_encode($testJSON));
}

/**
 * AES加密
 * @param $input
 * @param $key
 * @return string
 */
static function encrypt($input, $key)
{
    //@用于兼容高版本PHP
    $size = @mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
    //调取字符串加密方法
    $input = self::pkcs5_pad($input, $size);
    $td = @mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
    $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    //启动加密
    @mcrypt_generic_init($td, $key, $iv);
    $data = @mcrypt_generic($td, $input);
    @mcrypt_generic_deinit($td);
    @mcrypt_module_close($td);
    //进行hex编码
    $data = bin2hex($data);
    //返回加密后的字符串
    return $data;
}

/**
 *  字符串加密
 * @param $text
 * @param $blockSize
 * @return string
 */
static function pkcs5_pad($text, $blockSize)
{
    $pad = $blockSize - (strlen($text) % $blockSize);
    return $text . str_repeat(chr($pad), $pad);
}


/////////////////////       数据AES解密     ///////////////////// 

/**
 * 数据解密
 * @param $sStr
 * @param $sKey
 * @return bool|string
 */
static function decrypt($sStr, $sKey)
{
    //转换格式
    $sStr = hex2bin($sStr);
    //使用AES/ECB/PKCS5Padding模式进行解密
    $decrypted = @mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $sKey, $sStr, MCRYPT_MODE_ECB);
    //截取掉末尾
    $dec_s = strlen($decrypted);
    $padding = ord($decrypted[$dec_s - 1]);
    $decrypted = substr($decrypted, 0, -$padding);
    //得到解密体再进行还原成解码前的json数据
    $jsonData = urldecode($decrypted);
    //将json数据转换成数组格式
    $dataArray = json_decode($jsonData, true);
    //返回解密处理后的数据
    return $dataArray;
}


0条评论

发表评论