喜迎
春节

PHP实现AES加解密


系统中的账号信息在进行存储的时候,需要做相应的加密处理;比如用户密码一般是以密文形式存储,而且是不可逆的,常用的就是md5加密;而对于某些账户信息(如:手机号码、银行卡号等)就需要进行可逆加密(如:AES)保存,这样既可以保证数据的安全性,又不影响正常的业务处理。

下面介绍一下以PHP实现AES加密解密:

1. AES加密解密类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
namespace libs;
/**
* 利用mcrypt做AES加密解密
* 支持密钥:64bit(字节长度8)
* 支持算法:DES
* 支持模式:ECB
* 填充方式:PKCS5
*/
class Aes{
const CIPHER = MCRYPT_DES;
const MODE = MCRYPT_MODE_ECB;

/**
* 加密
* @param string $str 需加密的字符串
* @param string $key 密钥(8位)
* @return string 密文
*/
public static function encode($str,$key){
$size = mcrypt_get_block_size ( MCRYPT_DES, 'ecb' );
$str = self::pkcs5_pad($str, $size);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
$result = mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv);
return base64_encode($result);
}

/**
* 解密
* @param string $str 密文
* @param string $key 密钥(8位)
* @return string 明文
*/
public static function decode($str,$key){
$str = base64_decode($str);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
$str = trim(mcrypt_decrypt(self::CIPHER, $key, $str, self::MODE, $iv));
return self::pkcs5_unpad($str);
}

/**
* PKCS5填充
* @param $text
* @param $blocksize
* @return string
*/
private static function pkcs5_pad($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}

/**
*
* @param $text
* @return bool|string
*/
private 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 * namespace libs;
/**
* 利用mcrypt做AES加密解密
* 支持密钥:64bit(字节长度8)
* 支持算法:DES
* 支持模式:ECB
* 填充方式:PKCS5
*/
class Aes{
const CIPHER = MCRYPT_DES;
const MODE = MCRYPT_MODE_ECB;

/**
* 加密
* @param string $str 需加密的字符串
* @param string $key 密钥(8位)
* @return string 密文
*/
public static function encode($str,$key){
$size = mcrypt_get_block_size ( MCRYPT_DES, 'ecb' );
$str = self::pkcs5_pad($str, $size);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
$result = mcrypt_encrypt(self::CIPHER, $key, $str, self::MODE, $iv);
return base64_encode($result);
}

/**
* 解密
* @param string $str 密文
* @param string $key 密钥(8位)
* @return string 明文
*/
public static function decode($str,$key){
$str = base64_decode($str);
$iv = mcrypt_create_iv(mcrypt_get_iv_size(self::CIPHER,self::MODE),MCRYPT_RAND);
$str = trim(mcrypt_decrypt(self::CIPHER, $key, $str, self::MODE, $iv));
return self::pkcs5_unpad($str);
}

/**
* PKCS5填充
* @param $text
* @param $blocksize
* @return string
*/
private static function pkcs5_pad($text, $blocksize) {
$pad = $blocksize - (strlen($text) % $blocksize);
return $text . str_repeat(chr($pad), $pad);
}

/**
*
* @param $text
* @return bool|string
*/
private 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);
}
}

2. 调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace app\modules\demo\controllers;

use app\common\components\Controller;
use libs\Aes;

class TestController extends Controller{

public function actionTest(){
$key = 'WGiSP3UQ';
$str = '18958019299';
$enStr = Aes::encode($str,$key);
$deStr = Aes::decode($enStr,$key);
var_dump($str,$enStr,namespace app\modules\demo\controllers;

use app\common\components\Controller;
use libs\Aes;

class TestController extends Controller{

public function actionTest(){
$key = 'WGiSP3UQ';
$str = '18958019299';
$enStr = Aes::encode($str,$key);
$deStr = Aes::decode($enStr,$key);
var_dump($str,$enStr,$deStr);
}
}

3. 访问http://127.0.0.1/web/demo/test/test ,运行结果如下:

1
2
3
string(11) "18958019299" 
string(24) "WiBZggO/DRaczJ3wSirvEw=="
string(11) string(11) "18958019299"
string(24) "WiBZggO/DRaczJ3wSirvEw=="
string(11) "18958019299"

文章作者: Crazy Boy
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Crazy Boy !
评 论
 上一篇
Git使用笔记
Git使用笔记
常用命令12345678910111213git pull #拉取代码到本地git add . #将文件添加到暂存区git commit -m "xx" #提交代码,并填写
2018-04-25
下一篇 
JQuery面向对象写法
JQuery面向对象写法
书写Jquery代码时,普通的面向过程的写法可以实现功能,但不利于后期维护。现介绍面向对象的写法。 123456789101112<html> <head> <script src="jqu
2018-04-19
  目录