php对称加密算法(DES/AES)类功能实例

内容摘要
这篇文章主要为大家详细介绍了php对称加密算法(DES/AES)类功能实例,具有一定的参考价值,可以用来参考一下。

对php对称加密算法(DES/AES)类代码对此感兴趣的朋友,看看idc笔记做的
文章正文

这篇文章主要为大家详细介绍了php对称加密算法(DES/AES)类功能实例,具有一定的参考价值,可以用来参考一下。

对php对称加密算法(DES/AES)类代码对此感兴趣的朋友,看看idc笔记做的技术笔记!
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
<code class="php">
/**
 * php对称加密算法(DES/AES)类代码
 *
 * @param
 * @arrange 512-笔记网: www.512PiC.com
 **/
/**
 * 常用对称加密算法类
 * 支持密钥:64/128/256 bit(字节长度8/16/32)
 * 支持算法:DES/AES(根据密钥长度自动匹配使用:DES:64bit AES:128/256bit)
 * 支持模式:CBC/ECB/OFB/CFB
 * 密文编码:base64字符串/十六进制字符串/二进制字符串流
 * 填充方式: PKCS5Padding(DES)
 */ 
class Xcrypt{ 
    private $mcrypt
    private $key
    private $mode
    private $iv
    private $blocksize
    /**
     * 构造函数
     *
     * @param string 密钥
     * @param string 模式
     * @param string 向量("off":不使用 / "auto":自动 / 其他:指定值,长度同密钥)
     */ 
    public function __construct($key, $mode = 'cbc', $iv = "off"){ 
        switch (strlen($key)){ 
        case 8: 
            $this->mcrypt = MCRYPT_DES; 
            break
        case 16: 
            $this->mcrypt = MCRYPT_RIJNDAEL_128; 
            break
        case 32: 
            $this->mcrypt = MCRYPT_RIJNDAEL_256; 
            break
        default
            die("Key size must be 8/16/32"); 
        
        $this->key = $key
        switch (strtolower($mode)){ 
        case 'ofb'
            $this->mode = MCRYPT_MODE_OFB; 
            if ($iv == 'off') die('OFB must give a IV'); //OFB必须有向量 
            break
        case 'cfb'
            $this->mode = MCRYPT_MODE_CFB; 
            if ($iv == 'off') die('CFB must give a IV'); //CFB必须有向量 
            break
        case 'ecb'
            $this->mode = MCRYPT_MODE_ECB; 
            $iv = 'off'; //ECB不需要向量 
            break
        case 'cbc'
        default
            $this->mode = MCRYPT_MODE_CBC; 
        
        switch (strtolower($iv)){ 
        case "off"
            $this->iv = null; 
            break
        case "auto"
            $source = PHP_OS=='WINNT' ? MCRYPT_RAND : MCRYPT_DEV_RANDOM; 
            $this->iv = mcrypt_create_iv(mcrypt_get_block_size($this->mcrypt, $this->mode), $source); 
            break
        default
            $this->iv = $iv
        
    
    /**
     * 获取向量值
     * @param string 向量值编码(base64/hex/bin)
     * @return string 向量值
     */ 
    public function getIV($code = 'base64'){ 
        switch ($code){ 
        case 'base64'
            $ret = base64_encode($this->iv); 
            break
        case 'hex'
            $ret = bin2hex($this->iv); 
            break
        case 'bin'
        default
            $ret = $this->iv; 
        
        return $ret
    
    /**
     * 加密
     * @param string 明文
     * @param string 密文编码(base64/hex/bin)
     * @return string 密文
     */ 
    public function encrypt($str, $code = 'base64'){ 
        if ($this->mcrypt == MCRYPT_DES) $str = $this->_pkcs5Pad($str); 
        if (isset($this->iv)) { 
            $result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);   
        } else
            @$result = mcrypt_encrypt($this->mcrypt, $this->key, $str, $this->mode);   
        
        switch ($code){ 
        case 'base64'
            $ret = base64_encode($result); 
            break
        case 'hex'
            $ret = bin2hex($result); 
            break
        case 'bin'
        default
            $ret = $result
        
        return $ret
    
    /**
     * 解密 
     * @param string 密文
     * @param string 密文编码(base64/hex/bin)
     * @return string 明文
     */ 
    public function decrypt($str, $code = "base64"){     
        $ret = false; 
        switch ($code){ 
        case 'base64'
            $str = base64_decode($str); 
            break
        case 'hex'
            $str = $this->_hex2bin($str); 
            break
        case 'bin'
        default
        
        if ($str !== false){ 
            if (isset($this->iv)) { 
                $ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode, $this->iv);   
            } else
                @$ret = mcrypt_decrypt($this->mcrypt, $this->key, $str, $this->mode);   
            
            if ($this->mcrypt == MCRYPT_DES) $ret = $this->_pkcs5Unpad($ret); 
        
        return $ret;  
    }  
    private function _pkcs5Pad($text){ 
        $this->blocksize = mcrypt_get_block_size($this->mcrypt, $this->mode);   
        $pad = $this->blocksize - (strlen($text) % $this->blocksize); 
        return $text . str_repeat(chr($pad), $pad); 
    
    private function _pkcs5Unpad($text){ 
        $pad = ord($text{strlen($text) - 1}); 
        if ($pad > strlen($text)) return false; 
        if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) return false; 
        $ret = substr($text, 0, -1 * $pad); 
        return $ret
    
    private function _hex2bin($hex = false){ 
        $ret = $hex !== false && preg_match('/^[0-9a-fA-F]+$/i', $hex) ? pack("H*", $hex) : false;     
        return $ret
    
}
/***   来自php教程(www.idcnote.com)   ***/</code>
给个小demo吧
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
<code class="php">
/**
 * php对称加密算法(DES/AES)类代码
 *
 * @param
 * @arrange 512-笔记网: www.512PiC.com
 **/
<?php 
header('Content-Type:text/html;Charset=utf-8;'); 
include "xcrypt.php"
echo '<pre>'
////////////////////////////////////// 
$a = isset($_GET['a']) ? $_GET['a'] : '测试123'
//密钥 
$key = '12345678123456781234567812345678'; //256 bit 
$key = '1234567812345678'; //128 bit 
$key = '12345678'; //64 bit 
//设置模式和IV 
$m = new Xcrypt($key, 'cbc', 'auto'); 
//获取向量值 
echo '向量:'
var_dump($m->getIV()); 
//加密 
$b = $m->encrypt($a, 'base64'); 
//解密 
$c = $m->decrypt($b, 'base64'); 
echo '加密后:'
var_dump($b); 
echo '解密后:'
var_dump($c); 
///////////////////////////////////////// 
echo '</pre>'
/***   来自php教程(www.idcnote.com)   ***/</code>

注:关于php对称加密算法(DES/AES)类功能实例的内容就先介绍到这里,更多相关文章的可以留意

代码注释

作者:喵哥笔记

IDC笔记

学的不仅是技术,更是梦想!