美文网首页加密问题
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服务端对称加密解密的实现 !

  • CryptoJS 使用

    数组加密,Utf8编码,传递,加解密 加密,Base64编码,传递,解密 引用PHP 和 Web 端对称加密传输|...

  • 加密算法(面试)

    对称加密(市场上最多的加密方式) 需要对加密和解密使用相同的密钥的加密算法。(密钥本) 服务端的密钥与客户端的密钥...

  • Base64编码使用commons-codec中的api,在An

    1 在对接加密解密的时候,相同文本Base64编码后,移动端与服务端出现不一样的密文。移动使用的是Android_...

  • PHP/JS 互通加密-解密

    场景:服务端Php与前端Js 实现互通加密/加密 php7.1以后mcrypt_encrypt将被废弃,所以使用o...

  • android网络连接

    短连接 长连接 对称加密::1:先约定好秘钥 客户端对信息使 用 秘钥进行加密 服务端使用 秘钥解密

  • Https 原理

    客户端发请求服务端返回证书客户端信任证书,拿到非对称加密公钥,加密发送’对称加密的‘的密钥,服务端用非对称的私钥解...

  • PHP实现非对称加密

    内容来源(公众号:PHP基础入门教程)对称加密算法在加密和解密时使用的是同一个密钥。与对称加密算法不同,非对称加密...

  • kotlin版本RSA非对称加密解密与分段加密解密

    基于kotlin语言的RSA非对称加密解密与分段加密解密 RSA非对称加密 RSA非对称加密的具体算法与来源我就不...

  • RSA加密

    RSA加密为非对称加密实现 对称加密:加密解密使用同一个算法 非对称加密:加密和解密使用不同算法 rsa加密原理 ...

网友评论

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

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