• 推荐分享一个牛X的自定义PHP加密解密类


    通俗点说,用它来进行加密,同一个字符串,每次进行加密,得出的结果都是不一样的,大大加强了数据安全性。同时还可设定加密后数据的有效期,简直牛掰了

    #食用方法

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

    (7580是我自定义的密钥字符串,不喜欢可以定义其他字符串)

     1 ---------!这是简单的使用方法,不要粘贴这份保存为Mcrypt.class.php!--------
      <?php 2 3 require("Mcrypt.class.php") ; 4 5 $code = Mcrypt::encode('sajkfcasjcla','7580'); 6 7 echo "code-".$code; 8 9 echo "<hr>"; 10 11 $code_ans = Mcrypt::decode("$code",'7580'); 12 13 echo "answer-".$code_ans;

    浏览器输出效果如下图:

    贴出这个类的完整代码(请粘贴这份代码保存为Mcrypt.class.php):

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

    #注意事项

    KodCloud(可道云) 使用 GPL v3 协议,使用时该模块时请遵守协议

  • 相关阅读:
    第12组 Alpha事后诸葛亮
    第12组 Alpha冲刺(6/6)
    第12组 Alpha冲刺(5/6)
    2019 SDN上机第4次作业
    2019 SDN阅读作业
    第12组 Alpha冲刺(4/6)
    第12组 Alpha冲刺(3/6)
    第12组 Alpha冲刺(2/6)
    2019 SDN上机第3次作业
    第10组 Alpha冲刺(4/6)
  • 原文地址:https://www.cnblogs.com/phper12580/p/8927186.html
Copyright © 2020-2023  润新知