齐乐分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1068|回复: 0
收起左侧

[代码记录] [php代码]PHP动态加密解密

[复制链接]
爱站吧 发表于 2018-5-12 01:20:10 | 显示全部楼层 |阅读模式
这个模块是从可道云的代码中找到的,试了一下,非常好用!可用于对数据请求进行加密验证等。
通俗点说,用它来进行加密,同一个字符串,每次进行加密,得出的结果都是不一样的,大大加强了数据安全性。同时还可设定加密后数据的有效期,简直牛掰了。

使用方法


将下面的模块代码保存为 Mcrypt.class.php,然后在你需要用到的地方通过 require 的方式引入:

  1. <?php  
  2. require('Mcrypt.class.php'); //引入文件  
  3. $txt = Mcrypt::encode('要加密的内容','密匙',10);//加密内容,密匙,过期时间超过设置的时间后将无法解密/s  
  4. echo $txt.'</br>';  
  5. echo Mcrypt::decode($txt,'密匙');
复制代码


Mcrypt.class.php
  1. <?php  
  2. *------  
  3. * 字符串加解密类;  
  4. * 一次一密;且定时解密有效  
  5. * 可用于加密&动态key生成  
  6. * demo:   
  7. * 加密:echo Mcrypt::encode('abc','123');  
  8. * 解密:echo Mcrypt::decode('9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ','123');  
  9. */  
  10.    
  11. class Mcrypt{  
  12.     public $default_key = 'a!takA:dlmcldEv,e';  
  13.       
  14.     /**
  15.      * 字符加密,一次一密,可定时解密有效
  16.      *  
  17.      * @param string $string 原文
  18.      * @param string $key 密钥
  19.      * @param int $expiry 密文有效期,单位s,0 为永久有效
  20.      * @return string 加密后的内容
  21.      */  
  22.     public static function encode($string,$key = '', $expiry = 0){  
  23.         $ckeyLength = 4;  
  24.         $key = md5($key ? $key : $this->default_key); //解密密匙  
  25.         $keya = md5(substr($key, 0, 16));        //做数据完整性验证   
  26.         $keyb = md5(substr($key, 16, 16));       //用于变化生成的密文 (初始化向量IV)  
  27.         $keyc = substr(md5(microtime()), - $ckeyLength);  
  28.         $cryptkey = $keya . md5($keya . $keyc);   
  29.         $keyLength = strlen($cryptkey);  
  30.         $string = sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;  
  31.         $stringLength = strlen($string);  
  32.    
  33.         $rndkey = array();   
  34.         for($i = 0; $i <= 255; $i++) {   
  35.             $rndkey[$i] = ord($cryptkey[$i % $keyLength]);  
  36.         }  
  37.    
  38.         $box = range(0, 255);     
  39.         // 打乱密匙簿,增加随机性  
  40.         for($j = $i = 0; $i < 256; $i++) {  
  41.             $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
  42.             $tmp = $box[$i];  
  43.             $box[$i] = $box[$j];  
  44.             $box[$j] = $tmp;  
  45.         }     
  46.         // 加解密,从密匙簿得出密匙进行异或,再转成字符  
  47.         $result = '';  
  48.         for($a = $j = $i = 0; $i < $stringLength; $i++) {  
  49.             $a = ($a + 1) % 256;  
  50.             $j = ($j + $box[$a]) % 256;  
  51.             $tmp = $box[$a];  
  52.             $box[$a] = $box[$j];  
  53.             $box[$j] = $tmp;   
  54.             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));  
  55.         }  
  56.         $result = $keyc . str_replace('=', '', base64_encode($result));  
  57.         $result = str_replace(array('+', '/', '='),array('-', '_', '.'), $result);  
  58.         return $result;  
  59.     }  
  60.    
  61.     /**
  62.      * 字符解密,一次一密,可定时解密有效
  63.      *  
  64.      * @param string $string 密文
  65.      * @param string $key 解密密钥
  66.      * @return string 解密后的内容
  67.      */  
  68.     public static function decode($string,$key = '')  
  69.     {  
  70.         $string = str_replace(array('-', '_', '.'),array('+', '/', '='), $string);  
  71.         $ckeyLength = 4;  
  72.         $key = md5($key ? $key : $this->default_key); //解密密匙  
  73.         $keya = md5(substr($key, 0, 16));        //做数据完整性验证   
  74.         $keyb = md5(substr($key, 16, 16));       //用于变化生成的密文 (初始化向量IV)  
  75.         $keyc = substr($string, 0, $ckeyLength);  
  76.         $cryptkey = $keya . md5($keya . $keyc);   
  77.         $keyLength = strlen($cryptkey);  
  78.         $string = base64_decode(substr($string, $ckeyLength));  
  79.         $stringLength = strlen($string);  
  80.    
  81.         $rndkey = array();   
  82.         for($i = 0; $i <= 255; $i++) {   
  83.             $rndkey[$i] = ord($cryptkey[$i % $keyLength]);  
  84.         }  
  85.    
  86.         $box = range(0, 255);  
  87.         // 打乱密匙簿,增加随机性  
  88.         for($j = $i = 0; $i < 256; $i++) {  
  89.             $j = ($j + $box[$i] + $rndkey[$i]) % 256;  
  90.             $tmp = $box[$i];  
  91.             $box[$i] = $box[$j];  
  92.             $box[$j] = $tmp;  
  93.         }  
  94.         // 加解密,从密匙簿得出密匙进行异或,再转成字符  
  95.         $result = '';  
  96.         for($a = $j = $i = 0; $i < $stringLength; $i++) {  
  97.             $a = ($a + 1) % 256;  
  98.             $j = ($j + $box[$a]) % 256;  
  99.             $tmp = $box[$a];  
  100.             $box[$a] = $box[$j];  
  101.             $box[$j] = $tmp;   
  102.             $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));  
  103.         }  
  104.         if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0)  
  105.         && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)  
  106.         ) {  
  107.             return substr($result, 26);  
  108.         } else {  
  109.             return '';  
  110.         }   
  111.     }  
  112. }
复制代码


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

发布主题 上个主题 下个主题 快速回复 收藏帖子 返回列表 搜索
小黑屋|sitemap| |站点统计

版权所有:齐乐分享—技术交流,学习,分享平台 ( 皖ICP备14022669号-1 )

技术支持:Powered by Discuz! X3.4 Copyright © 2013-2018 Comsenz Inc. All Rights Reserved

GMT+8, 2022-5-17 16:44 , Processed in 0.101696 second(s), 8 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表