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");