首页 > 代码库 > 几种类型加解密

几种类型加解密

  1 <?php
  2 /**
  3  * $name authcode加密
  4  * @param string $string 明文或密文
  5  * @param string $operation DECODE表示解密,其它表示加密;
  6  * @param string $key 密匙
  7  * @param int $expiry 密文有效期
  8  * @return string
  9  */
 10 function authcode($string, $operation = ‘DECODE‘, $key = ‘‘, $expiry = 0)
 11 {
 12 // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙
 13     $ckey_length = 4;
 14 
 15 // 密匙
 16     $key = md5($key ? $key : $GLOBALS[‘discuz_auth_key‘]);
 17 
 18 // 密匙a会参与加解密
 19     $keya = md5(substr($key, 0, 16));
 20 // 密匙b会用来做数据完整性验证
 21     $keyb = md5(substr($key, 16, 16));
 22 // 密匙c用于变化生成的密文
 23     $keyc = $ckey_length ? ($operation == ‘DECODE‘ ? substr($string, 0, $ckey_length) :
 24         substr(md5(microtime()), -$ckey_length)) : ‘‘;
 25 // 参与运算的密匙
 26     $cryptkey = $keya . md5($keya . $keyc);
 27     $key_length = strlen($cryptkey);
 28 // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b),
 29 //解密时会通过这个密匙验证数据完整性
 30 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确
 31     $string = $operation == ‘DECODE‘ ? base64_decode(substr($string, $ckey_length)) :
 32         sprintf(‘%010d‘, $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
 33     $string_length = strlen($string);
 34     $result = ‘‘;
 35     $box = range(0, 255);
 36     $rndkey = array();
 37 // 产生密匙簿
 38     for ($i = 0; $i <= 255; $i++) {
 39         $rndkey[$i] = ord($cryptkey[$i % $key_length]);
 40     }
 41 // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度
 42     for ($j = $i = 0; $i < 256; $i++) {
 43         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
 44         $tmp = $box[$i];
 45         $box[$i] = $box[$j];
 46         $box[$j] = $tmp;
 47     }
 48 // 核心加解密部分
 49     for ($a = $j = $i = 0; $i < $string_length; $i++) {
 50         $a = ($a + 1) % 256;
 51         $j = ($j + $box[$a]) % 256;
 52         $tmp = $box[$a];
 53         $box[$a] = $box[$j];
 54         $box[$j] = $tmp;
 55 // 从密匙簿得出密匙进行异或,再转成字符
 56         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
 57     }
 58     if ($operation == ‘DECODE‘) {
 59 // 验证数据有效性,请看未加密明文的格式
 60         if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
 61             return substr($result, 26);
 62         } else {
 63             return ‘‘;
 64         }
 65     } else {
 66 // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因
 67 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码
 68         return $keyc . str_replace(‘=‘, ‘‘, base64_encode($result));
 69     }
 70 }
 71 $str = ‘abcdef‘;
 72 $key = ‘www.test.com‘;
 73 $authcode =  authcode($str,‘ENCODE‘,$key,0); //加密
 74 echo $authcode;
 75 echo authcode($authcode,‘DECODE‘,$key,0); //解密
 76 
 77 //encrypt加解密
 78 /**
 79  * @param string $string 明文或密文
 80  * @param string $operation 判断是加密还是解密,E表示加密,D表示解密
 81  * @param string $key 密匙
 82  * @return mixed|string
 83  */
 84 function encrypt($string, $operation, $key = ‘‘)
 85 {
 86     $key = md5($key);
 87     $key_length = strlen($key);
 88     $string = $operation == ‘D‘ ? base64_decode($string) : substr(md5($string . $key), 0, 8) . $string;
 89     $string_length = strlen($string);
 90     $rndkey = $box = array();
 91     $result = ‘‘;
 92     for ($i = 0; $i <= 255; $i++) {
 93         $rndkey[$i] = ord($key[$i % $key_length]);
 94         $box[$i] = $i;
 95     }
 96     for ($j = $i = 0; $i < 256; $i++) {
 97         $j = ($j + $box[$i] + $rndkey[$i]) % 256;
 98         $tmp = $box[$i];
 99         $box[$i] = $box[$j];
100         $box[$j] = $tmp;
101     }
102     for ($a = $j = $i = 0; $i < $string_length; $i++) {
103         $a = ($a + 1) % 256;
104         $j = ($j + $box[$a]) % 256;
105         $tmp = $box[$a];
106         $box[$a] = $box[$j];
107         $box[$j] = $tmp;
108         $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
109     }
110     if ($operation == ‘D‘) {
111         if (substr($result, 0, 8) == substr(md5(substr($result, 8) . $key), 0, 8)) {
112             return substr($result, 8);
113         } else {
114             return ‘‘;
115         }
116     } else {
117         return str_replace(‘=‘, ‘‘, base64_encode($result));
118     }
119 
120 }
121 $str = ‘abc‘;
122 $key = ‘www.test.com‘;
123 $token = encrypt($str, ‘E‘, $key);
124 echo ‘加密:‘.encrypt($str, ‘E‘, $key);
125 echo ‘解密:‘.encrypt($str, ‘D‘, $key);
126 
127 /**
128  * 用DES算法加密字符串
129  * @param string $string 数组可以转化成json格式的字符串
130  * @param string $key
131  * @return string 
132  */
133 function des_encrypt($string, $key)
134 {
135     $size = mcrypt_get_block_size(‘des‘, ‘ecb‘);
136     $string = mb_convert_encoding($string, ‘GBK‘, ‘UTF-8‘);
137     $pad = $size - (strlen($string) % $size);
138     $string = $string . str_repeat(chr($pad), $pad);
139     $td = mcrypt_module_open(‘des‘, ‘‘, ‘ecb‘, ‘‘);
140     $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);
141     @mcrypt_generic_init($td, $key, $iv);
142     $data = mcrypt_generic($td, $string);
143     mcrypt_generic_deinit($td);
144     mcrypt_module_close($td);
145     $data = base64url_encode($data);
146     return $data;
147 }
148 
149 /**
150  * 用DES算法解密字符串
151  * @param string $string
152  * @param string $key
153  * @return mixed 
154  */
155 function des_decrypt($string, $key)
156 {
157     $string = base64url_decode($string);
158     $td = mcrypt_module_open(‘des‘, ‘‘, ‘ecb‘, ‘‘);
159     $iv = @mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_URANDOM);
160     //$ks = mcrypt_enc_get_key_size($td);
161     @mcrypt_generic_init($td, $key, $iv);
162     $decrypted = mdecrypt_generic($td, $string);
163     mcrypt_generic_deinit($td);
164     mcrypt_module_close($td);
165     $pad = ord($decrypted{strlen($decrypted) - 1});
166     if ($pad > strlen($decrypted)) {
167         return false;
168     }
169     if (strspn($decrypted, chr($pad), strlen($decrypted) - $pad) != $pad) {
170         return false;
171     }
172     $result = substr($decrypted, 0, -1 * $pad);
173     $result = mb_convert_encoding($result, ‘UTF-8‘, ‘GBK‘);
174     return $result;
175 }
176 function base64url_encode($data) { 
177   return rtrim(strtr(base64_encode($data), ‘+/‘, ‘-_‘), ‘=‘); 
178 } 
179 
180 function base64url_decode($data) { 
181   return base64_decode(str_pad(strtr($data, ‘-_‘, ‘+/‘), strlen($data) % 4, ‘=‘, STR_PAD_RIGHT)); 
182 } 

 

几种类型加解密