ecshop的aes加密(封装)
从一家做shopex,ecstore的公司到一家做b2b的ecshop的公司...来了就要实战,其他的不说了,先来了解什么是php的aes加密吧?
aes(高级加密标准),AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;是一个可逆的加密方式,同md5不同。
AES分为几种模式,比如ECB,CBC,CFB等等,这些模式除了ECB由于没有使用IV而不太安全,其他模式差别并没有太明显,大部分的区别在IV和KEY来计算密文的方法略有区别。
iv的作用?
IV称为初始向量,不同的IV加密后的字符串是不同的,加密和解密需要相同的IV,既然IV看起来和key一样,却还要多一个IV的目的,对于每个块来说,key是不变的,但是只有第一个块的IV是用户提供的,其他块IV都是自动生成。
IV的长度为16字节。超过或者不足,可能实现的库都会进行补齐或截断。但是由于块的长度是16字节,所以一般可以认为需要的IV是16字节。
到现在对aes有了一定的了解,就开始上代码吧。
- <?php
- class cryptaes{
- protected $cipher = MCRYPT_RIJNDAEL_128;
- protected $mode = MCRYPT_MODE_ECB;
- protected $pad_method = '';
- 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)
- {
- print_r($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);
- }
- }
- ?>
aes加密解密封装类封装好了,在需要的地方加密:
- require_once(ROOT_PATH . 'includes/lib_smt_cryptaes.php'); //ecshop引入文件方式
- $aes_obj = new cryptaes();
- $iv = '12345678baiducom';
- $privateKey = '12345678baiducom';
- $data['a'] = ‘周二’;
- $data['b'] = ‘周三’;
- $data['c'] = ‘周四’;
- $da = json_encode($data);
- $aes_obj->set_key($privateKey);
- $aes_obj->require_pkcs5();
- $aes_obj->set_iv($iv);
- $il = $aes_obj->encrypt($da);
- //写入cookie
- setcookie('il', $il,time()+360000); //加密结果$il
这边我想传递的是一个数组,需要注意的是aes只能加密字符串。需要转换为字符串。
- $il = $_COOKIE['il'];
- require_once(ROOT_PATH . 'includes/lib_smt_cryptaes.php');
- $aes_obj = new cryptaes();
- $keyStr = '12345678baiducom';//密钥
- $iv = '12345678baiducom';
- $aes_obj->set_key($keyStr);
- $aes_obj->require_pkcs5();
- $aes_obj->set_iv($iv);
- $j_token = $aes_obj->decrypt($il);
- $j_token = json_decode($j_token,true);
print_r($j_token);//解密结果
这样就完成了aes的加密,及传输。
欢迎大家提出问题,大家一起交流,一起成长。
欢迎大家关注我的 订阅号:博客乐园
ecshop的aes加密(封装)的更多相关文章
- AES加密解密工具类封装(AESUtil)
package club.codeapes.common.utils; import org.springframework.util.Base64Utils; import javax.crypto ...
- openssl与cryptoAPI交互AES加密解密
继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...
- c#之AES加密解密
.Net已封装好算法,直接调用即可,代码如下: 转载请注明出处:https://www.cnblogs.com/jietian331/p/9707771.html using System; usin ...
- JAVA RSA加密AES加密
RSA加密: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; imp ...
- C# AES 加密与解密
AES 算法加密(ECB模式) 将明文加密,加密后进行base64编码,返回密文 /// <summary> /// AES 算法加密(ECB模式) 将明文加密,加密后进行base64编码 ...
- Java使用AES加密解密
AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...
- 使用as3crypto在Flex中实现AES加密
要在Flex中实现AES加密,可以通过as3crypto实现.但是as3crypto本身的用法比较复杂,一般是封装一下再调用. 下面是9RIA上的一篇文章给出的一个实现,使用中稍感不方便(见注释): ...
- c# .NET RSA结合AES加密服务端和客户端请求数据
这几天空闲时间就想研究一下加密,环境是web程序,通过js请求后台返回数据,我想做的事js在发送请求前将数据加密,服务端收到后解密,待服务端处理完请求后,将处理结果加密返回给客户端,客户端在解密,于是 ...
- 基于MbedTLS的AES加密实现,含STM32H7和STM32F4的实现例程
说明: 1.mbedTLS的前身是PolarSSL,开源免费. 主要提供了的SSL/TLS支持(在传输层对网络进行加密),各种加密算法,各种哈希算法,随机数生成以及X.509(密码学里公钥证书的格式标 ...
随机推荐
- phpcms页面替换
首页的替换流程首先要先把静态网页做出来,拿到这里来: 会发现这个网页里面少了图片,样式表也没有了 因为我们只把网页扔过来,所对应的图片和样式表没有扔过来 图片什么的应该扔到: 接着打开index.ht ...
- Oracle清除数据库中长时间占用资源的非活动的会话
1.启动资源计划 alter system set resource_limit=true scope=spfile; 2.设置非活动回话十五分钟断开,释放资源 alter profile defau ...
- Vue.js 实战总结
最近在某个项目中用到了Vue.js,从上手做开发到项目发布,一步步踩了不少坑.本文试图总结过去一个多月使用Vue.js中的一些经验,也算是一点心得体会吧,拿出来与大家分享,欢迎多多交流. Vue.js ...
- 初码-Azure系列-迁移PHP应用至Azure的一些实践记录和思考
最近客户在逐步迁移应用从阿里云到Azure,这次又轮到一个PHP+MySQL应用了,顺便也记一下流水账. 需求:迁移部署在阿里云上的ECS服务器(系列2,IO优化+2核4G+50G的SSD云盘+10M ...
- AlertDialog的写法
public void onItemClick(AdapterView<?> parent, View view, int position,long id) { AlertDialog. ...
- JSONObjec序列化对象过滤为null的属性
@Test public void test3() { PgwReqtBody3002 pgwReqtBody3002 = new PgwReqtBody3002(); pgwReqtBody3002 ...
- Swift 入门之简单语法(六)
KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [Str ...
- Js判断是否是直接进入本页面的
今天带来一个Js的小示例,用来判断当前页面的链接来路.很多人应该可以用到,这个虽然非常简单,但是用到的地方却还是挺多的 首先新建一个index.html,代码如下 <!DOCTYPE html& ...
- offsetHeight/Width clientHeight/Width scrollHeight/Width等高宽算法
图解: jquery里的对应取法: clientHeight/Width:innerHeight/Width(), offsetHeight/Width: outerHeight/Width(). w ...
- VR全景智慧城市—你的掌上步行街
"春风十里,不如有你",不知不觉间,身边的人已对VR不再陌生,VR眼镜的热销,VR体验店的火爆,VR游戏的向往等等.可见VR就是为生活而诞生! 2015年被称作VR行业的产业元年, ...