java aes php_php和java的aes默认加密算法有点区别及解决方法。
1.php和java的aes默认加密算法有点区别,php能解密java加密的密文,但java不能解密php加密的密文。原因在于:
1.Java中AES加密与解密默认使用AES/ECB/PKCS5Padding模式;
2.php中的AES算法实现使用AES/ECB/NoPadding
所以,把php的aes加密算法的补码方式采用 PKCS5Padding 模式即可。
附上可用的php和java 加解密互通的算法类。
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 = $cipher;
}
public function set_mode($mode)
{
$this->mode = $mode;
}
public function set_iv($iv)
{
$this->iv = $iv;
}
public function set_key($key)
{
$this->secret_key = $key;
}
public function require_pkcs5()
{
$this->pad_method = 'pkcs5';
}
protected function pad_or_unpad($str, $ext)
{
if ( is_null($this->pad_method) )
{
return $str;
}
else
{
$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);
}
}
return $str;
}
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);
}
else
{
$iv = $this->iv;
}
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);
return $rt;
}
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);
}
else
{
$iv = $this->iv;
}
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_text;
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 < $length; $i += 2)
{
$bindata .= chr(hexdec(substr($hexdata, $i, 2)));
}
return $bindata;
}
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)) return false;
if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
return substr($text, 0, -1 * $pad);
}
}
$keyStr = '1345679';
$plainText = 'a1e470e3bcc2953626cd6341fea4bd68';
$aes = new CryptAES();
$aes->set_key($keyStr);
$aes->require_pkcs5();
$encText = $aes->encrypt($plainText);
$decString = $aes->decrypt('$encText');
java aes php_php和java的aes默认加密算法有点区别及解决方法。相关推荐
- 关于Jupyter Notebook默认起始目录设置无效的解决方法
关于Jupyter Notebook默认起始目录设置无效的解决方法 参考文章: (1)关于Jupyter Notebook默认起始目录设置无效的解决方法 (2)https://www.cnblogs. ...
- Redis 5.0.3默认配置启动报错解决方法
Redis 5.0.3默认配置启动报错解决方法 参考文章: (1)Redis 5.0.3默认配置启动报错解决方法 (2)https://www.cnblogs.com/miclesvic/p/1031 ...
- android删除打开方式,Android 打开方式选定后默认了改不回来?解决方法(三星s7为例)...
Android 打开方式选定后默认了改不回来?解决方法(三星s7为例) 刚刚在测试东西,打开一个gif图,然后我故意选择用支付宝打开,然后...支付宝当然不支持,我觉得第二次打开它应该还会问我,没想到 ...
- 某个应用导致html文件,某个应用导致你的默认浏览器设置出现问题(补丁又闯祸:Windows 10默认应用被重置 附解决方法)...
某个应用导致你的默认浏览器设置出现问题(补丁又闯祸:Windows 10默认应用被重置 附解决方法),哪吒游戏网给大家带来详细的某个应用导致你的默认浏览器设置出现问题(补丁又闯祸:Windows 10 ...
- 已重置默认应用设置html,win10已重置应用默认设置一直弹怎么办_win10已重置应用默认设置老是弹出解决方法...
有的用户可能会遇到已重置应用默认设置一直弹出的情况,这个情况让大家都很烦恼,不知道该怎么解决.那么win10已重置应用默认设置一直弹怎么办?这应该也是许多用户想知道的,下面我们就一起来看看win10已 ...
- 为什么玩我的世界老提示Java se错误_我的世界error错误信息 error could解决方法
我的世界是一个及其开放的沙盒游戏,而在这个游戏中有不少的问题,比如说遇到error该如何解决呢,看小编给大家带来的我的世界error错误的解决方法,希望大家喜欢. error应用程序错误信息.包括&q ...
- java mysql 插入 乱码_java向mysql插入数据乱码问题的解决方法
遇到java向mysql插入数据乱码问题,如何解决? MySQL默认编码是latin1 mysql> show variables like 'character%'; +----------- ...
- java org.jsoup does not exist_java使用Jsoup连接网站超时的解决方法
今天做了一个Jsoup解析网站的项目,使用Jsoup.connect(url).get()连接某网站时偶尔会出现 java.net.SocketTimeoutException:Read timed ...
- java工程编辑器中文乱码_Java Web开发项目中中文乱码解决方法汇总
Java Web项目中,解决中文乱码方法总结如下 第一种情况:调用jsp页面中文显示乱码问题描述:通过浏览器调用jsp页面,在浏览器中显示的中文内容出现乱码. 解决方法:首先确认本jsp在编辑器中保存 ...
最新文章
- 【MATLAB】符号数学计算(二):符号运算中的运算符和函数
- c# winform窗口自适应各种分辨率类
- 三种实现分布式解决方案原理分析
- Hadoop—LDAP介绍和使用
- 概率论和数理统计 - 01
- 基于微型计算机系统的实时时钟设计,基于51单片机的实时时钟设计报告.doc
- java8 hashmap_Java8 中的 HashMap
- Vue源码学习: 关于对Array的数据侦听
- 笔记:css中的position定位
- MongoDB在Windows环境下部署
- 51单片机中外部中断使用示例(Protues仿真)
- Symbian手记【四】 —— Symbian的容器
- 美国大学计算机理论专业phd,揭秘美国大学计算机专业PHD申请难度
- linux音频转换软件,音频转换软件(XRecode 3)
- word怎么删除参考文献的横线_教大家word2016怎么去掉引用参考文献中的横线
- 如何在C加加的面向对象写石头剪刀布游戏
- 计算机专业、软件技术、工程等学编程的同学电脑必配环境
- Tomcat - 解决which must be escaped when used within the value错误
- 分数指数幂计算机,分数指数幂的教案
- 芯片到底是怎么制造的?
热门文章
- mysql innodb 设置,Mysql5.5 InnoDB存储引擎简单设置
- python中random模块中包含了随机数相关的功能函数_Python中random模块生成随机数详解...
- 基于线段的激光雷达和单目联合曲面重建
- c++ Lambda
- 如何批量文件格式转化
- 【坑爹升级】更新NVIDIA GeForce GTX Ti最新驱动,突然屏幕亮瞎我24K钛合金双眼。导致Fn+F2/F3、win+x无法控制笔记本电脑显示器亮度调整, 电源选项屏幕亮度也不见了!
- 在Ubuntu 16.04.5 LTS上利用python中的PIL模块压缩一百多兆的单张图片实操
- 在ATS插件中使用互斥锁
- C语言中整型浮点型在计算机中的存储
- 使用CEfSharp之旅(7)CEFSharp 拦截 http 请求 websocket 内容