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(密码学里公钥证书的格式标 ...
随机推荐
- 解决jmeter乱码问题(改配置文件)
1.先改脚本里面的 content encoding为utf-8 然后response为utf-8 2.如果以上还是不可以,那就改配置文件jmeter.properties,里面的sampleresu ...
- CentOS系统搭建gitolite服务
1.安装相关支持软件 a.$yum install perl-Time-HiRes openssh-server perl -y b.$yum -y install git 2.服务端操作:创建git ...
- windows下命令行cmder工具
windows下系统自带的命令行工具,实在是太丑了,输入命令后,有时排版乱七八糟,而且使用惯liunx系统的命令后,实在是不能够接受,这么蹩脚的工具:为此我给大家推荐一款实用的开源工具cmder 下载 ...
- 《Android进阶》Sqlite的使用
之前认为Sqlite只能一次性创建多个表,其实不是 关键是对Sqlite的操作需要一些技巧: package com.example.mydemo; import android.content.Co ...
- JMeter-Eclipse添加自定义函数 MD5加密 32位和16位
最近公司的接口都是MD5 16位加密,所以要使用加密功能. 之前也做过加密,因为用的比较少,所以是写了一个加密方法,导出JAR包,调用的.用起来需要很多设置,并且换算效率也不高.听前同事说,jmet ...
- Drools 6.5 Final 入门
Drools 6.5 Final学习笔记 最近项目中要涉及到使用规则对数据进行操作,想到自己实现一个完整且能灵活满足业务需求的规则系统太难了,就想了解一下有没有开源的规则引擎可以使用,后来发现Droo ...
- cas4.2以下取消https
deployerConfigContext.xml增加参数p:requireSecure="false" <bean class="org.jasig.cas.au ...
- IE 不兼容 js indexOf 函数
在使用 js 判断数组中是否存储该元素,我们会用到 indexOf 函数.而在 IE 上 indexOf 函数 无法兼容,通过以下方法解决,仅以文章记录一下 if (!Array.prototyp ...
- Redis基本数据类型以及String(一)
前言: Redis也有自己的数据类型,包含string,list,hash,set,sorted set.下面就对每种数据类型原理以及操作做一个详细的介绍. Redis是面向编程的语言 ...
- nested exception is java.sql.SQLException: Cannot convert value '0000-00-00 00:00:00' from column 14 to TIMESTAMP.
无法将"0000-00-00 00:00:00"转换为TIMESTAMP 2017-05-08 00:56:59 [ERROR] - cn.kee.core.dao.impl.Ge ...