php与java对接中c aes加密解密密前面一部分有乱码怎么解决。

AES 加密 PHP 和 JAVA 互通
AES 加密 PHP 和 JAVA 互通
见代码:&PHP代码:&&?phpclass Security { public static function encrypt($input, $key) { $size = mcrypt_get_block_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB); $input = Security::pkcs5_pad($input, $size); $td = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, ''); $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size($td), MCRYPT_RAND); mcrypt_generic_init($td, $key, $iv); $data = mcrypt_generic($td, $input); mcrypt_generic_deinit($td); mcrypt_module_close($td); $data = base64_encode($data); return $ }& private static function pkcs5_pad ($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad); }& public static function decrypt($sStr, $sKey) {
$decrypted= mcrypt_decrypt(
MCRYPT_RIJNDAEL_128,
base64_decode($sStr),
MCRYPT_MODE_ECB );&
$dec_s = strlen($decrypted);
$padding = ord($decrypted[$dec_s-1]);
$decrypted = substr($decrypted, 0, -$padding);
return $ } }&&&$key = "4567";$data = "example";&$value = Security::encrypt($data , $key );echo $value.'&br/&';echo Security::decrypt($value, $key );&---------------java 代码&&&import javax.crypto.Cimport javax.crypto.spec.SecretKeyS&import mons.codec.binary.Base64;&public class Security { public static String encrypt(String input, String key){ byte[] crypted = try{ SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, skey); crypted = cipher.doFinal(input.getBytes()); }catch(Exception e){ System.out.println(e.toString()); } return new String(Base64.encodeBase64(crypted));}&public static String decrypt(String input, String key){ byte[] output = try{ SecretKeySpec skey = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skey); output = cipher.doFinal(Base64.decodeBase64(input)); }catch(Exception e){ System.out.println(e.toString()); } return new String(output);}& public static void main(String[] args) {
String key = "4567";
String data = "example";
System.out.println(Security.encrypt(data, key));
System.out.println(Security.decrypt(Security.encrypt(data, key), key));
发表评论:
TA的最新馆藏PHP与JAVA使用AES128位加密通信&&
问题:联调时候发现php的解密解析不了java加密后的东西,解出来发现时乱码,当时就崩溃了,,奇了怪了,看了这篇文章,我真的是要醉了。。。。。。。。。。最后附上了php类库,留作以后备用。
问题:使用Java默认的AES加密方式(Cipher.getInstance(&AES&))并对加密后结果进行Base64编码,这样php(使用这里免费的AES实现版本
附:php aes类库
class AesDe{ &
& & const SHA1 = 'SHA1';
& & const CBC = 'cbc';
& & const CIPHER = 'rijndael-128';
& & const BLOCKSIZE = 128;
& & const HASH_ITERATIONS = 10000;
& & const KEY_LENGTH = 32;
& & //偏移变量
& & private $arrIv = array(0xA, 1, 0xB, 5, 4, 0xF, 7, 9, 0x17, 3, 1, 6, 8, 0xC, 0xD, 91);
& & //salt 值
& & private $arrSalt = array(1, 3, 9, 6, 9, 4, 4, 4, 0, 2, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF);&
& & public function aes($ostr, $aes_key, $type='encrypt'){
& & & & if($ostr==''){
& & & & & & return '';
& & & & //只能用128解密,虽然大地的demo是256
& & & & $td & = mcrypt_module_open(self::CIPHER, '', self::CBC, '');
& & & & //不能用随机的iv
& & & & $iv & = self::genIV();
& & & & $salt = self::genSalt();
& & & & $key &= self::pbkdf2(self::SHA1, $aes_key, $salt, self::HASH_ITERATIONS, self::KEY_LENGTH);
& & & & mcrypt_generic_init($td, $key, $iv);
& & & & $str = '';
& & & & switch($type){
& & & & & & case 'encrypt':
& & & & & & & & $str = trim(base64_encode(mcrypt_generic($td, $this-&pkcs5Pad($ostr))));
& & & & & & & &
& & & & & & case 'decrypt':
& & & & & & & & $str = trim(mdecrypt_generic($td, base64_decode($ostr)));
& & & & & & & &
& & & & mcrypt_generic_deinit($td);
& & & & mcrypt_module_close($td);
& & & & return $
& & private function pbkdf2($algorithm, $password, $salt, $count, $key_length) {
& & & & $algorithm = strtolower($algorithm);
& & & & if(!in_array($algorithm, hash_algos(), true)){
& & & & & & trigger_error('PBKDF2 ERROR: Invalid hash algorithm.', E_USER_ERROR);
& & & & if($count &= 0 || $key_length &= 0) {
& & & & & & trigger_error('PBKDF2 ERROR: Invalid parameters.', E_USER_ERROR);
& & & & $hash_length = strlen(hash($algorithm, &&, true));
& & & & $block_count = ceil($key_length / $hash_length);
& & & & $output = &&;
& & & & for($i = 1; $i &= $block_ $i++) {
& & & & & & $last = $salt . pack(&N&, $i);
& & & & & & $last = $xorsum = hash_hmac($algorithm, $last, $password, true);
& & & & & & for ($j = 1; $j & $ $j++) {
& & & & & & & & $xorsum ^= ($last = hash_hmac($algorithm, $last, $password, true));
& & & & & & }
& & & & & & $output .= $
& & & & return substr($output, 0, $key_length);
& & private function &genIV() {
& & & & $iv = '';
& & & & foreach($this-&arrIv as $value) {
& & & & & & $iv .= chr($value);
& & & & return $
& & private function genSalt() {
& & & & $salt = '';
& & & & foreach($this-&arrSalt as $value) {
& & & & & & $salt .= chr($value);
& & & & return $
& & private function pkcs5Pad($data) {
& & & & $blockSize = mcrypt_get_block_size(self::CIPHER, self::CBC); &&
& & & & $pad = $blockSize - (strlen($data) % $blockSize);
& & & & return $data . str_repeat(chr($pad), $pad);
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2564次
排名:千里之外
(3)(1)(3)(1)JAVA和PHP通用的加解密整理版(AES,DES…)
JAVA和PHP通用的加解密整理版(AES,DES…)
发布时间: 0:25:10
编辑:www.fx114.net
本篇文章主要介绍了"JAVA和PHP通用的加解密整理版(AES,DES…)",主要涉及到JAVA和PHP通用的加解密整理版(AES,DES…)方面的内容,对于JAVA和PHP通用的加解密整理版(AES,DES…)感兴趣的同学可以参考一下。
JAVA和PHP通用的加解密整理版(AES,DES…)
日常开放中 平台中通常不会只有单一的环境,因此跨平台的通讯 通常会使用标准的AES,DES等加密规则
公司的项目开发中 遇到了JAVA和PHP的加密解密跨平台的问题 经过多方查找资料以及研究找出一个通用的基础加解密方案如下
1:JAVA代码 (3DES版)
import javax.crypto.C
import javax.crypto.SecretK
import javax.crypto.spec.SecretKeyS
import org.apache.log4j.L
import sun.misc.BASE64D
import sun.misc.BASE64E
* Java版3DES加密解密,适用于PHP版3DES加密解密(PHP语言开发的MCRYPT_3DES算法、MCRYPT_MODE_ECB模式、PKCS7填充方式)
* @author G007N
public class DesBase64Tool {
private static SecretKey secretKey =//key对象
private static Cipher cipher = //私鈅加密对象Cipher
private static String keyString = &AKlMU89D3FchIkhKyMma6FiE&;//密钥
private static Logger log = Logger.getRootLogger();
secretKey = new SecretKeySpec(keyString.getBytes(), &DESede&);//获得密钥
/*获得一个私鈅加密类Cipher,DESede是算法,ECB是加密模式,PKCS5Padding是填充方式*/
cipher = Cipher.getInstance(&DESede/ECB/PKCS5Padding&);
} catch (Exception e) {
log.error(e.getMessage(), e);
* @param message
public static String desEncrypt(String message) {
String result = &&; //DES加密字符串
String newResult = &&;//去掉换行符后的加密字符串
cipher.init(Cipher.ENCRYPT_MODE, secretKey); //设置工作模式为加密模式,给出密钥
byte[] resultBytes = cipher.doFinal(message.getBytes(&UTF-8&)); //正式执行加密操作
BASE64Encoder enc = new BASE64Encoder();
result = enc.encode(resultBytes);//进行BASE64编码
newResult = filter(result); //去掉加密串中的换行符
} catch (Exception e) {
log.error(e.getMessage(), e);
return newR
* @param message
* @throws Exception
public static String desDecrypt(String message) throws Exception {
String result = &&;
BASE64Decoder dec = new BASE64Decoder();
byte[] messageBytes = dec.decodeBuffer(message); //进行BASE64编码
cipher.init(Cipher.DECRYPT_MODE, secretKey); //设置工作模式为解密模式,给出密钥
byte[] resultBytes = cipher.doFinal(messageBytes);//正式执行解密操作
result = new String(resultBytes,&UTF-8&);
} catch (Exception e) {
e.printStackTrace();
* 去掉加密字符串换行符
* @param str
public static String filter(String str) {
String output = &&;
StringBuffer sb = new StringBuffer();
for (int i = 0; i & str.length(); i++) {
int asc = str.charAt(i);
if (asc != 10 && asc != 13) {
sb.append(str.subSequence(i, i+1));
output = new String(sb);
* 加密解密测试
* @param args
public static void main(String[] args) {
String strText = &Hello world!&;
String deseResult = desEncrypt(strText);//加密
System.out.println(&加密结果:&+deseResult);
String desdResult = desDecrypt(deseResult);//解密
System.out.println(&解密结果:&+desdResult);
} catch (Exception e) {
e.printStackTrace();
2:PHP版本(3DES)
3des的已经不再使用了 因此没有专门整理成类 凑活看吧哈哈
function pkcs5_pad($text, $blocksize)
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
function pkcs5_unpad($text)
$pad = ord($text{strlen($text)-1});
if ($pad & strlen($text))
if( strspn($text, chr($pad), strlen($text) - $pad) != $pad)
return substr($text, 0, -1 * $pad);
$key = &AKlMU89D3FchIkhKyMma6FiE&;
//$key = pack(&H48&, $key);
$iv = &0708&;
$iv = pack(&H16&, $iv);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, $iv);
$str = base64_encode(mcrypt_generic($td,pkcs5_pad(&1qaz2ws&,8)));
echo $str .&&;
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
mcrypt_generic_init($td, $key, $iv);
$ttt = pkcs5_unpad(mdecrypt_generic($td, base64_decode($str)));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
3:JAVA版本(AES)
将代码1中的如下行修改
& /*密钥为16的倍数*/
private static String keyString = &AKlMU89D3FchIkhK&;//密钥
/*AES算法*/
secretKey = new SecretKeySpec(keyString.getBytes(), &AES&);//获得密钥
/*获得一个私鈅加密类Cipher,DESede-》AES算法,ECB是加密模式,PKCS5Padding是填充方式*/
cipher = Cipher.getInstance(&AES/ECB/PKCS5Padding&);
4:PHP版本(AES)
开发中选择了AES
class CryptAES
protected $cipher = MCRYPT_RIJNDAEL_128;
protected $mode = MCRYPT_MODE_ECB;
protected $pad_method = NULL;
protected $secret_key = '';
protected $iv = '';
public function set_cipher($cipher)
$this-&cipher = $
public function set_mode($mode)
$this-&mode = $
public function set_iv($iv)
$this-&iv = $
public function set_key($key)
$this-&secret_key = $
public function require_pkcs5()
$this-&pad_method = 'pkcs5';
protected function pad_or_unpad($str, $ext)
if ( is_null($this-&pad_method) )
$func_name = __CLASS__ . '::' . $this-&pad_method . '_' . $ext . 'pad';
if ( is_callable($func_name) )
$size = mcrypt_get_block_size($this-&cipher, $this-&mode);
return call_user_func($func_name, $str, $size);
protected function pad($str)
return $this-&pad_or_unpad($str, '');
protected function unpad($str)
return $this-&pad_or_unpad($str, 'un');
public function encrypt($str)
$str = $this-&pad($str);
$td = mcrypt_module_open($this-&cipher, '', $this-&mode, '');
if ( empty($this-&iv) )
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$iv = $this-&
mcrypt_generic_init($td, $this-&secret_key, $iv);
$cyper_text = mcrypt_generic($td, $str);
$rt=base64_encode($cyper_text);
//$rt = bin2hex($cyper_text);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
public function decrypt($str){
$td = mcrypt_module_open($this-&cipher, '', $this-&mode, '');
if ( empty($this-&iv) )
$iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
$iv = $this-&
mcrypt_generic_init($td, $this-&secret_key, $iv);
//$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));
$decrypted_text = mdecrypt_generic($td, base64_decode($str));
$rt = $decrypted_
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
return $this-&unpad($rt);
public static function hex2bin($hexdata) {
$bindata = '';
$length = strlen($hexdata);
for ($i=0; $i & $ $i += 2)
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
public static function pkcs5_pad($text, $blocksize)
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
public static function pkcs5_unpad($text)
$pad = ord($text{strlen($text) - 1});
if ($pad & strlen($text))
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad)
return substr($text, 0, -1 * $pad);
$aes = new CryptAES();
//密钥修改成了16位 和JAVA的一致
$aes-&set_key('AKlMU89D3FchIkhK');
//$aes-&set_key('AKlMU89D3FchIkhKyMma6FiE');
$aes-&require_pkcs5();
$rt = $aes-&encrypt('1qaz2ws');
echo $rt . '&br/&';
echo $aes-&decrypt($rt) . '&br/&';
转载://java和php通用的加解密整理版(aesdes-)/
本文标题:
本页链接:网络上DesUtil.java关于汉字加密解密出现乱码的问题
网络上DesUtil.java关于汉字加密解密出现乱码的问题
[摘要:代码去自以下链接 http://www.oschina.net/code/piece_full?code= 起首声明的是,代码没有是自己写的,谢谢一下做者,只不外自己正在做一个android客户端,取办事器servlet接心通讯的项目时,对]
代码来自以下链接
http://www.oschina.net/code/piece_full?code=
首先声明的是,代码不是本人写的,感谢一下作者,只不过本人在做一个android客户端,与服务器servlet接口通信的项目时,对协议作了des+base64加密处理,使用了该类,
期间遇到了一个比较纠结的问题,就是如果汉字存在于协议中,服务器加密,客户端解密会出现乱码,客户端加密,服务器解密亦然。
以上问题的解决其实很简单,只不过找问题原因的过程有点浪费时间,所以记录在此,以告知其他有缘也用到该类的朋友,能够节省一点宝贵的时间。
修改代码如下:
* Description 根据键值进行加密
* @param data
* @param key
加密键byte数组
* @throws Exception
public static String encrypt(String data, String key) throws Exception {
byte[] bt = encrypt(data.getBytes(&UTF-8&), key.getBytes());
String strs = new BASE64Encoder().encode(bt);
* Description 根据键值进行解密
* @param data
* @param key
加密键byte数组
* @throws IOException
* @throws Exception
public static String decrypt(String data, String key) throws IOException,
Exception {
if (data == null)
BASE64Decoder decoder = new BASE64Decoder();
byte[] buf = decoder.decodeBuffer(data);
byte[] bt = decrypt(buf,key.getBytes());
return new String(bt, &UTF-8&);
请留意,修改的两处为&UTF-8&的位置。
希望大伙没有遇到这个问题。
感谢关注 Ithao123加密解密频道,是专门为互联网人打造的学习交流平台,全面满足互联网人工作与学习需求,更多互联网资讯尽在 IThao123!
Laravel是一套简洁、优雅的PHP Web开发框架(PHP Web Framework)。它可以让你从面条一样杂乱的代码中解脱出来;它可以帮你构建一个完美的网络APP,而且每行代码都可以简洁、富于表达力。
产品设计是互联网产品经理的核心能力,一个好的产品经理一定在产品设计方面有扎实的功底,本专题将从互联网产品设计的几个方面谈谈产品设计
Swift是Apple在WWDC2014所发布的一门编程语言,用来撰写OS X和iOS应用程序[1]。在设计Swift时.就有意和Objective-C共存,Objective-C是Apple操作系统在导入Swift前使用的编程语言
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来使得编程更加简单、灵活和有趣。界面则基于广受人民群众爱戴的Cocoa和Cocoa Touch框架,展示了软件开发的新方向。
PHP(外文名:PHP: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言。语法吸收了C语言、Java和Perl的特点,利于学习,使用广泛,主要适用于Web开发领域。PHP 独特的语法混合了C、Java、Perl以及PHP自创的语法。它可以比CGI或者Perl更快速地执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML(标准通用标记语言下的一个应用)文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;PHP还可以执行编译后代码,编译可以达到加密和优化代码运行,使代码运行更快。
IThao123周刊}

我要回帖

更多关于 java aes加密解密 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信