PHP可逆加密函数
简洁版:
很多时候我们需要对数据进行加密解密,比如有些数据需要保存到cookie中,但又不能被用户轻易得到这些数据,这时我们就需要加密这些数据保存到cookie中,等我们需要使用它们的时候再解密。
加密的过程如下:
PHP Code复制内容到剪贴板
- //加密数据并写到cookie里
- $cookie_data = $this -> encrypt("nowamagic", $data);
- $cookie = array(
- 'name' => '$data',
- 'value' => $cookie_data,
- 'expire' => $user_expire,
- 'domain' => '',
- 'path' => '/',
- 'prefix' => ''
- );
- $this->input->set_cookie($cookie);
- //加密
- public function encrypt($key, $plain_text) {
- $plain_text = trim($plain_text);
- $iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));
- $c_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $plain_text, MCRYPT_ENCRYPT, $iv);
- return trim(chop(base64_encode($c_t)));
- }
使用的时候再解密:
PHP Code复制内容到剪贴板
- if( isset($_COOKIE['data']) ){
- //用cookie给session赋值
- $_SESSION['data'] = decrypt("nowamagic", $_COOKIE['data']);
- }
- function decrypt($key, $c_t) {
- $c_t = trim(chop(base64_decode($c_t)));
- $iv = substr(md5($key), 0,mcrypt_get_iv_size (MCRYPT_CAST_256,MCRYPT_MODE_CFB));
- $p_t = mcrypt_cfb (MCRYPT_CAST_256, $key, $c_t, MCRYPT_DECRYPT, $iv);
- return trim(chop($p_t));
- }
升级版:
可逆加密函数改dz的支持数组。
PHP Code复制内容到剪贴板
- <?php
- /**
- $data 原文或者密文支持数组
- $operation 操作(0 | 1), 默认为0解密
- $key 密钥
- $expiry密文有效期, 加密时候有效, 单位 秒,0 为永久有效
- */
- header("Content-type:text/html;charset=utf-8");
- function authcode($data,$key='www.phpin.net',$operation=0,$expiry=0){
- $ckey_length=6;
- $keya=sha1($key);
- $keyb=substr(md5($key),$ckey_length);
- $data=$operation==0?$data:serialize($data);
- $keyc=$ckey_length ? ($operation==0 ? substr($data,0,$ckey_length):substr(md5(microtime()),-$ckey_length)):'';
- $cryptkey=$keya.md5($keya.$keyc);
- $key_length=strlen($cryptkey);
- $data=$operation==0 ? base64_decode(substr($data,$ckey_length)):sprintf('%010d',$expiry ? $expiry+time():0).substr(md5($data.$keyb),0,16).$data;
- $data_length=strlen($data);
- $result='';
- $box=range(0,255);
- $rndkey=array();
- for($i=0;$i<=255;$i++){
- $rndkey[$i]=ord($cryptkey[$i%$key_length]);
- }
- for($j=$i=0;$i<256;$i++){
- $j=($j+$box[$i]+$rndkey[$i])%256;
- $tmp=$box[$i];
- $box[$i]=$box[$j];
- $box[$j]=$tmp;
- }
- for($a=$j=$i=0;$i<$data_length;$i++){
- $a=($a+1)%256;
- $j=($j+$box[$a])%256;
- $tmp=$box[$a];
- $box[$a]=$box[$j];
- $box[$j]=$tmp;
- $result.=chr(ord($data[$i]) ^ ($box[($box[$a]+$box[$j])%256]));
- }
- if($operation==0){
- if((substr($result,0,10)==0||substr($result,0,10)-time()>0)&&substr($result,10,16)==substr(md5(substr($result,26).$keyb),0,16)){
- return unserialize(substr($result,26));
- }else{
- return '';
- }
- }else{
- return $keyc.str_replace('=','',base64_encode($result));
- }
- }
- echo $a = authcode(array(1,'fsdg',3),'www.yonglan.net',1);
- echo '<br />';
- $b = authcode($a,'www.yonglan.net'); //支持数组
- print_r($b);
- echo '<br />';
- echo $a = authcode('15128282867', 'key', 1,3600);
- echo '<br />';
- echo $b = authcode($a, 'key'); // 在一个小时内,$b(abc),否则 $b 为空
- echo '<br />';