php三种常用的加密解密算法

方法一:

  1 /**
  2 
  3  * @param $string    要加密/解密的字符串
  4 
  5  * @param string $operation   类型,ENCODE 加密;DECODE 解密
  6 
  7  * @param string $key    密匙
  8 
  9  * @param int $expiry    有效期
 10 
 11  * @return string
 12 
 13  */
 14 
 15 function authcode($string, $operation = 'DECODE', $key = 'encrypt', $expiry = 0)
 16 
 17 {
 18 
 19     // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
 20 
 21     $ckey_length = 4;
 22 
 23     // 密匙
 24 
 25     $key = md5($key ? $key : $GLOBALS['discuz_auth_key']);
 26 
 27     // 密匙a会参与加解密
 28 
 29     $keya = md5(substr($key, 0, 16));
 30 
 31     // 密匙b会用来做数据完整性验证
 32 
 33     $keyb = md5(substr($key, 16, 16));
 34 
 35     // 密匙c用于变化生成的密文
 36 
 37     $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) :
 38 
 39         substr(md5(microtime()), -$ckey_length)) : '';
 40 
 41     // 参与运算的密匙
 42 
 43     $cryptkey = $keya . md5($keya . $keyc);
 44 
 45     $key_length = strlen($cryptkey);
 46 
 47     // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
 48 
 49     //解密时会通过这个密匙验证数据完整性
 50 
 51     // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
 52 
 53     $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) :
 54 
 55         sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
 56 
 57     $string_length = strlen($string);
 58 
 59     $result = '';
 60 
 61     $box = range(0, 255);
 62 
 63     $rndkey = array();
 64 
 65     // 产生密匙簿
 66 
 67     for ($i = 0; $i <= 255; $i++) {
 68 
 69         $rndkey[$i] = ord($cryptkey[$i % $key_length]);
 70 
 71     }
 72 
 73     // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
 74 
 75     for ($j = $i = 0; $i < 256; $i++) {
 76 
 77         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
 78 
 79         $tmp = $box[$i];
 80 
 81         $box[$i] = $box[$j];
 82 
 83         $box[$j] = $tmp;
 84 
 85     }
 86 
 87     // 核心加解密部分
 88 
 89     for ($a = $j = $i = 0; $i < $string_length; $i++) {
 90 
 91         $a = ($a + 1) % 256;
 92 
 93         $j = ($j + $box[$a]) % 256;
 94 
 95         $tmp = $box[$a];
 96 
 97         $box[$a] = $box[$j];
 98 
 99         $box[$j] = $tmp;
100 
101         // 从密匙簿得出密匙进行异或,再转成字符
102 
103         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
104 
105     }
106 
107     if ($operation == 'DECODE') {
108 
109         // 验证数据有效性,请看未加密明文的格式
110 
111         if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) &&
112 
113             substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)
114 
115         ) {
116 
117             return substr($result, 26);
118 
119         } else {
120 
121             return '';
122 
123         }
124 
125     } else {
126 
127         // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
128 
129         // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
130 
131         return $keyc . str_replace('=', '', base64_encode($result));
132 
133     }
134 
135 }

使用:

 1 $string = '加密字符串';
 2 
 3 // 加密
 4 
 5 $encode = authcode($string, 'ENCODE');
 6 
 7 echo $encode . '</br>';       // a2f4bSYyUrTum1nAAA9X9BrC4Z3DZazcSa4eLcvDoCnmYc1LTdvtqS4aCds
 8 
 9 // 解密
10 
11 $decode = authcode($encode, 'DECODE');
12 
13 echo $decode;     // 加密字符串

方法二:

 1 /**
 2 
 3  * @param $string    要加密/解密的字符串
 4 
 5  * @param $operation    类型,E 加密;D 解密
 6 
 7  * @param string $key   密钥
 8 
 9  * @return mixed|string
10 
11  */
12 
13 function encrypt($string, $operation, $key = 'encrypt')
14 
15 {
16 
17     $key = md5($key);
18 
19     $key_length = strlen($key);
20 
21     $string = $operation == 'D' ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
22 
23     $string_length = strlen($string);
24 
25     $rndkey = $box = array();
26 
27     $result = '';
28 
29     for ($i = 0; $i <= 255; $i++) {
30 
31         $rndkey[$i] = ord($key[$i % $key_length]);
32 
33         $box[$i] = $i;
34 
35     }
36 
37     for ($j = $i = 0; $i < 256; $i++) {
38 
39         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
40 
41         $tmp = $box[$i];
42 
43         $box[$i] = $box[$j];
44 
45         $box[$j] = $tmp;
46 
47     }
48 
49     for ($a = $j = $i = 0; $i < $string_length; $i++) {
50 
51         $a = ($a + 1) % 256;
52 
53         $j = ($j + $box[$a]) % 256;
54 
55         $tmp = $box[$a];
56 
57         $box[$a] = $box[$j];
58 
59         $box[$j] = $tmp;
60 
61         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
62 
63     }
64 
65     if ($operation == 'D') {
66 
67         if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
68 
69             return substr($result, 8);
70 
71         } else {
72 
73             return '';
74 
75         }
76 
77     } else {
78 
79         return str_replace('=', '', base64_encode($result));
80 
81     }
82 
83 }

使用:

 1 $string = '加密字符串';
 2 
 3 // 加密
 4 
 5 $encode = encrypt($string, 'E');
 6 
 7 echo $encode . '</br>';       // 0Jzym5UzkRKH726U7Pyt7ixzLz9YEEA
 8 
 9 // 解密
10 
11 $decode = encrypt($encode, 'D');
12 
13 echo $decode;     // 加密字符串

方法三:

  1 /**
  2 
  3  * @param $data  要加密的字符串
  4 
  5  * @param $key   密钥
  6 
  7  * @return string
  8 
  9  */
 10 
 11 function encrypt($data, $key = 'encrypt')
 12 
 13 {
 14 
 15     $key = md5($key);
 16 
 17     $x = 0;
 18 
 19     $len = strlen($data);
 20 
 21     $l = strlen($key);
 22 
 23     $char = '';
 24 
 25     for ($i = 0; $i < $len; $i++) {
 26 
 27         if ($x == $l) {
 28 
 29             $x = 0;
 30 
 31         }
 32 
 33         $char .= $key{$x};
 34 
 35         $x++;
 36 
 37     }
 38 
 39     $str = '';
 40 
 41     for ($i = 0; $i < $len; $i++) {
 42 
 43         $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256);
 44 
 45     }
 46 
 47     return base64_encode($str);
 48 
 49 }
 50 
 51  
 52 
 53  
 54 
 55 /**
 56 
 57  * @param $data    要解密的字符串
 58 
 59  * @param $key     密钥
 60 
 61  * @return string
 62 
 63  */
 64 
 65 function decrypt($data, $key = 'encrypt')
 66 
 67 {
 68 
 69     $key = md5($key);
 70 
 71     $x = 0;
 72 
 73     $data = base64_decode($data);
 74 
 75     $len = strlen($data);
 76 
 77     $l = strlen($key);
 78 
 79     $char = '';
 80 
 81     for ($i = 0; $i < $len; $i++) {
 82 
 83         if ($x == $l) {
 84 
 85             $x = 0;
 86 
 87         }
 88 
 89         $char .= substr($key, $x, 1);
 90 
 91         $x++;
 92 
 93     }
 94 
 95     $str = '';
 96 
 97     for ($i = 0; $i < $len; $i++) {
 98 
 99         if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))) {
100 
101             $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1)));
102 
103         } else {
104 
105             $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1)));
106 
107         }
108 
109     }
110 
111     return $str;
112 
113 }

使用:

 1 $string = '加密字符串';
 2 
 3 // 加密
 4 
 5 $encode = encrypt($string);
 6 
 7 echo $encode . '</br>';       // Gr0DHeHrRw7KGBLcSOzj
 8 
 9 // 解密
10 
11 $decode = decrypt($encode);
12 
13 echo $decode;     // 加密字符串