从一家做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有了一定的了解,就开始上代码吧。

  1. <?php
  2.  
  3. class cryptaes{
  4. protected $cipher = MCRYPT_RIJNDAEL_128;
  5. protected $mode = MCRYPT_MODE_ECB;
  6. protected $pad_method = '';
  7. protected $secret_key = '';
  8. protected $iv = '';
  9.  
  10. public function set_cipher($cipher)
  11. {
  12. $this->cipher = $cipher;
  13. }
  14.  
  15. public function set_mode($mode)
  16. {
  17. $this->mode = $mode;
  18. }
  19.  
  20. public function set_iv($iv)
  21. {
  22. $this->iv = $iv;
  23. }
  24.  
  25. public function set_key($key)
  26. {
  27. $this->secret_key = $key;
  28. }
  29.  
  30. public function require_pkcs5()
  31. {
  32. $this->pad_method = 'pkcs5';
  33. }
  34.  
  35. protected function pad_or_unpad($str, $ext)
  36. {
  37. if ( is_null($this->pad_method) )
  38. {
  39. return $str;
  40. }
  41. else
  42. {
  43. $func_name = __CLASS__ . '::' . $this->pad_method . '_' . $ext . 'pad';
  44. if ( is_callable($func_name) )
  45. {
  46. $size = mcrypt_get_block_size($this->cipher, $this->mode);
  47. return call_user_func($func_name, $str, $size);
  48. }
  49. }
  50. return $str;
  51. }
  52.  
  53. protected function pad($str)
  54. {
  55. return $this->pad_or_unpad($str, '');
  56. }
  57.  
  58. protected function unpad($str)
  59. {
  60. return $this->pad_or_unpad($str, 'un');
  61. }
  62. //加密类
  63. public function encrypt($str)
  64. {
  65. print_r($str);
  66. $str = $this->pad($str);
  67. $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
  68.  
  69. if ( empty($this->iv) )
  70. {
  71. $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  72. }
  73. else
  74. {
  75. $iv = $this->iv;
  76. }
  77.  
  78. mcrypt_generic_init($td, $this->secret_key, $iv);
  79. $cyper_text = mcrypt_generic($td, $str);
  80. $rt=base64_encode($cyper_text);
  81. //$rt = bin2hex($cyper_text);
  82. mcrypt_generic_deinit($td);
  83. mcrypt_module_close($td);
  84.  
  85. return $rt;
  86. }
  87. //解密类
  88. public function decrypt($str){
  89. $td = mcrypt_module_open($this->cipher, '', $this->mode, '');
  90.  
  91. if ( empty($this->iv) )
  92. {
  93. $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  94. }
  95. else
  96. {
  97. $iv = $this->iv;
  98. }
  99.  
  100. mcrypt_generic_init($td, $this->secret_key, $iv);
  101. //$decrypted_text = mdecrypt_generic($td, self::hex2bin($str));
  102. $decrypted_text = mdecrypt_generic($td, base64_decode($str));
  103. $rt = $decrypted_text;
  104. mcrypt_generic_deinit($td);
  105. mcrypt_module_close($td);
  106.  
  107. return $this->unpad($rt);
  108. }
  109.  
  110. public static function hex2bin($hexdata) {
  111. $bindata = '';
  112. $length = strlen($hexdata);
  113. for ($i=0; $i < $length; $i += 2)
  114. {
  115. $bindata .= chr(hexdec(substr($hexdata, $i, 2)));
  116. }
  117. return $bindata;
  118. }
  119.  
  120. public static function pkcs5_pad($text, $blocksize)
  121. {
  122. $pad = $blocksize - (strlen($text) % $blocksize);
  123. return $text . str_repeat(chr($pad), $pad);
  124. }
  125.  
  126. public static function pkcs5_unpad($text)
  127. {
  128. $pad = ord($text{strlen($text) - 1});
  129. if ($pad > strlen($text)) return false;
  130. if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false;
  131. return substr($text, 0, -1 * $pad);
  132. }
  133. }
  134. ?>

aes加密解密封装类封装好了,在需要的地方加密:

  1. require_once(ROOT_PATH . 'includes/lib_smt_cryptaes.php'); //ecshop引入文件方式
  2. $aes_obj = new cryptaes();
  3. $iv = '12345678baiducom';
  4. $privateKey = '12345678baiducom';
  5.  
  6. $data['a'] = ‘周二’;
  7. $data['b'] = ‘周三’;
  8. $data['c'] = ‘周四’;
  9.  
  10. $da = json_encode($data);
  11. $aes_obj->set_key($privateKey);
  12. $aes_obj->require_pkcs5();
  13. $aes_obj->set_iv($iv);
  14. $il = $aes_obj->encrypt($da);
  15. //写入cookie
  16. setcookie('il', $il,time()+360000); //加密结果$il

这边我想传递的是一个数组,需要注意的是aes只能加密字符串。需要转换为字符串。

  1.        $il = $_COOKIE['il'];
  2. require_once(ROOT_PATH . 'includes/lib_smt_cryptaes.php');
  3. $aes_obj = new cryptaes();
  4. $keyStr = '12345678baiducom';//密钥
  5. $iv = '12345678baiducom';
  6.  
  7. $aes_obj->set_key($keyStr);
  8. $aes_obj->require_pkcs5();
  9. $aes_obj->set_iv($iv);
  10. $j_token = $aes_obj->decrypt($il);
  11. $j_token = json_decode($j_token,true);
           print_r($j_token);//解密结果

这样就完成了aes的加密,及传输。

欢迎大家提出问题,大家一起交流,一起成长。

欢迎大家关注我的 订阅号:博客乐园

ecshop的aes加密(封装)的更多相关文章

  1. AES加密解密工具类封装(AESUtil)

    package club.codeapes.common.utils; import org.springframework.util.Base64Utils; import javax.crypto ...

  2. openssl与cryptoAPI交互AES加密解密

    继上次只有CryptoAPI的加密后,这次要实现openssl的了 动机:利用CryptoAPI制作windows的IE,火狐和chrome加密控件后,这次得加上与android的加密信息交互 先前有 ...

  3. c#之AES加密解密

    .Net已封装好算法,直接调用即可,代码如下: 转载请注明出处:https://www.cnblogs.com/jietian331/p/9707771.html using System; usin ...

  4. JAVA RSA加密AES加密

    RSA加密: import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; imp ...

  5. C# AES 加密与解密

    AES 算法加密(ECB模式) 将明文加密,加密后进行base64编码,返回密文 /// <summary> /// AES 算法加密(ECB模式) 将明文加密,加密后进行base64编码 ...

  6. Java使用AES加密解密

    AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...

  7. 使用as3crypto在Flex中实现AES加密

    要在Flex中实现AES加密,可以通过as3crypto实现.但是as3crypto本身的用法比较复杂,一般是封装一下再调用. 下面是9RIA上的一篇文章给出的一个实现,使用中稍感不方便(见注释): ...

  8. c# .NET RSA结合AES加密服务端和客户端请求数据

    这几天空闲时间就想研究一下加密,环境是web程序,通过js请求后台返回数据,我想做的事js在发送请求前将数据加密,服务端收到后解密,待服务端处理完请求后,将处理结果加密返回给客户端,客户端在解密,于是 ...

  9. 基于MbedTLS的AES加密实现,含STM32H7和STM32F4的实现例程

    说明: 1.mbedTLS的前身是PolarSSL,开源免费. 主要提供了的SSL/TLS支持(在传输层对网络进行加密),各种加密算法,各种哈希算法,随机数生成以及X.509(密码学里公钥证书的格式标 ...

随机推荐

  1. phpcms页面替换

    首页的替换流程首先要先把静态网页做出来,拿到这里来: 会发现这个网页里面少了图片,样式表也没有了 因为我们只把网页扔过来,所对应的图片和样式表没有扔过来 图片什么的应该扔到: 接着打开index.ht ...

  2. Oracle清除数据库中长时间占用资源的非活动的会话

    1.启动资源计划 alter system set resource_limit=true scope=spfile; 2.设置非活动回话十五分钟断开,释放资源 alter profile defau ...

  3. Vue.js 实战总结

    最近在某个项目中用到了Vue.js,从上手做开发到项目发布,一步步踩了不少坑.本文试图总结过去一个多月使用Vue.js中的一些经验,也算是一点心得体会吧,拿出来与大家分享,欢迎多多交流. Vue.js ...

  4. 初码-Azure系列-迁移PHP应用至Azure的一些实践记录和思考

    最近客户在逐步迁移应用从阿里云到Azure,这次又轮到一个PHP+MySQL应用了,顺便也记一下流水账. 需求:迁移部署在阿里云上的ECS服务器(系列2,IO优化+2核4G+50G的SSD云盘+10M ...

  5. AlertDialog的写法

    public void onItemClick(AdapterView<?> parent, View view, int position,long id) { AlertDialog. ...

  6. JSONObjec序列化对象过滤为null的属性

    @Test public void test3() { PgwReqtBody3002 pgwReqtBody3002 = new PgwReqtBody3002(); pgwReqtBody3002 ...

  7. Swift 入门之简单语法(六)

    KVC 字典转模型构造函数 /// `重写`构造函数 /// /// - parameter dict: 字典 /// /// - returns: Person 对象 init(dict: [Str ...

  8. Js判断是否是直接进入本页面的

    今天带来一个Js的小示例,用来判断当前页面的链接来路.很多人应该可以用到,这个虽然非常简单,但是用到的地方却还是挺多的 首先新建一个index.html,代码如下 <!DOCTYPE html& ...

  9. offsetHeight/Width clientHeight/Width scrollHeight/Width等高宽算法

    图解: jquery里的对应取法: clientHeight/Width:innerHeight/Width(), offsetHeight/Width: outerHeight/Width(). w ...

  10. VR全景智慧城市—你的掌上步行街

    "春风十里,不如有你",不知不觉间,身边的人已对VR不再陌生,VR眼镜的热销,VR体验店的火爆,VR游戏的向往等等.可见VR就是为生活而诞生! 2015年被称作VR行业的产业元年, ...