美文网首页加密问题
Android移动端与PHP服务端对称加密解密的实现 !

Android移动端与PHP服务端对称加密解密的实现 !

作者: DragonersLi | 来源:发表于2016-09-06 00:28 被阅读555次
    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);
    
        }
    
    }
     
    
    
    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");
    
    

    相关文章

      网友评论

        本文标题:Android移动端与PHP服务端对称加密解密的实现 !

        本文链接:https://www.haomeiwen.com/subject/ercdettx.html