Android与PHP接口数据加密解密方案

PHP端代码

class ApiCrypter{ 

    private $iv  = 'fdsfds85435nfdfs'; #与JAVA实现类中的设置必须一致

    private $key = '89432hjfsd891787'; #与JAVA实现类中的设置必须一致


    public function __construct() {

    }


    public function encrypt($str) { 

      $str = $this->pkcs5_pad($str);   

      $iv = $this->iv; 

      $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); 

      mcrypt_generic_init($td, $this->key, $iv);

      $encrypted = mcrypt_generic($td, $str); 

      mcrypt_generic_deinit($td);

      mcrypt_module_close($td); 

      return bin2hex($encrypted);

    }

    public function decrypt($code) { 

      $code = $this->hex2bin($code);

      $iv = $this->iv; 

      $td = mcrypt_module_open('rijndael-128', '', 'cbc', $iv); 

      mcrypt_generic_init($td, $this->key, $iv);

      $decrypted = mdecrypt_generic($td, $code); 

      mcrypt_generic_deinit($td);

      mcrypt_module_close($td); 

      $ut =  utf8_encode(trim($decrypted));

      return $this->pkcs5_unpad($ut);

    }


    protected function hex2bin($hexdata) {

      $bindata = ''; 

      for ($i = 0; $i < strlen($hexdata); $i += 2) {

          $bindata .= chr(hexdec(substr($hexdata, $i, 2)));

      } 

      return $bindata;

    } 


    protected function pkcs5_pad ($text) {

      $blocksize = 16;

      $pad = $blocksize - (strlen($text) % $blocksize);

      return $text . str_repeat(chr($pad), $pad);

    }


    protected function pkcs5_unpad($text) {

      $pad = ord($text{strlen($text)-1});

      if ($pad > strlen($text)) {

          return false;    

      }

      if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {

          return false;

      }

      return substr($text, 0, -1 * $pad);

    }

}

Android 代码

package com.cwilldev.crypt;


import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;


public class ApiCrypter {


    private String iv              = "fdsfds85435nfdfs"; //根据实际需要更改

    private String secretkey       = "89432hjfsd891787"; //根据实际需要更改

    private IvParameterSpec ivspec;

    private SecretKeySpec keyspec;

    private Cipher cipher;


    public ApiCrypter()

    {

        ivspec = new IvParameterSpec(iv.getBytes());

        keyspec = new SecretKeySpec(secretkey.getBytes(), "AES");


        try {

            cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

        } catch (NoSuchAlgorithmException e) {

            e.printStackTrace();

        } catch (NoSuchPaddingException e) {

            e.printStackTrace();

        }

    }


    public byte[] encrypt(String text) throws Exception

    {

        if(text == null || text.length() == 0) {

            throw new Exception("Empty string");

        }

        byte[] encrypted = null;

        try {

            cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec);

            encrypted = cipher.doFinal(text.getBytes("UTF-8"));

        }

        catch (Exception e) {

            throw new Exception("[encrypt] " + e.getMessage());

        }

        return encrypted;

    }


    public byte[] decrypt(String code) throws Exception

    {

        if(code == null || code.length() == 0) {

            throw new Exception("Empty string");

        }

        byte[] decrypted = null;

        try {

            cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec);

            decrypted = cipher.doFinal(hexToBytes(code));

        }

        catch (Exception e) {

            throw new Exception("[decrypt] " + e.getMessage());

        }

        return decrypted;

    }


    public static String bytesToHex(byte[] data)

    {

        if (data==null) {

            return null;

        }

        int len = data.length;

        String str = "";

        for (int i=0; i<len; i++) {

            if ((data[i]&0xFF)<16) {

                str = str + "0" + java.lang.Integer.toHexString(data[i]&0xFF);

            }

            else {

                str = str + java.lang.Integer.toHexString(data[i]&0xFF);

            }

        }

        return str;

    }


    public static byte[] hexToBytes(String str) {

        if (str==null) {

            return null;

        }

        else if (str.length() < 2) {

            return null;

        }

        else {

            int len = str.length() / 2;

            byte[] buffer = new byte[len];

            for (int i=0; i<len; i++) {

                buffer[i] = (byte) Integer.parseInt(str.substring(i*2,i*2+2),16);

            }

            return buffer;

        }

    }


}




$original_text = 'test';

$mdes = new ApiCrypterUtil();

//加密

$encrypt_text = $mdes->encrypt($original_text);

$this->log($encrypt_text, LOG_DEBUG);

//解密

$this->log($mdes->decrypt($encrypt_text), LOG_DEBUG);

 

//加密:

ApiCrypter apiCrypter = new ApiCrypter();

String originalText = "test";

String encryptedText = ApiCrypter.bytesToHex(apiCrypter.encrypt(jsonParams.toString()));

//解密:

String res = new String(apiCrypter.decrypt(encryptedText), "UTF-8"); 

String decryptedText = URLDecoder.decode(res, "UTF-8");

 

posted @ 2018-09-11 17:52  QzBlog  阅读(355)  评论(0编辑  收藏  举报