您的位置:首页 > 移动开发 > Android开发

【转载】Android移动端与PHP服务端对称加密解密的实现

2013-07-01 14:17 696 查看
原文出处:Encryption between Java/Android And PHP 转载请注明原出处,尊重作者的原创,谢谢。

在网上找了很多实现,绝大多数都是不可用的,即android端和PHP端对同一字符串加密生成不一样的密文。但这个版本经测试是可用的,android版本:4.0.4,PHP5。

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);
}
}
?>


JAVA类实现

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;
}
}

}


PHP加密解密方法:

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


Java加密解密方法:

//加密:
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");
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: