搜索
查看: 623|回复: 0
收起左侧

[聊天互动] 一个独特的 PHP 加密解密模块

[复制链接]

签到天数: 75 天

[LV.6]常住居民II

发表于 2021-12-22 18:29:38 | 显示全部楼层 |阅读模式


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


使用方法:
将下面的代码保存为Mcrypt.class.php
然后在你需要用到的地方通过 require的方式引用
  1. require('Mcrypt.class.php');
复制代码



加密一个数据的方法:
  1. echo Mcrypt::encode('要加密的内容','密匙');
复制代码


解密数据的方法:
  1. echo Mcrypt::decode('密文','加密时的密匙');
复制代码



模块完整代码


  1. <?php

  2. /*
  3. * @link http://kodcloud.com/
  4. * @author warlee | e-mail:kodcloud@qq.com
  5. * @copyright warlee 2014.(Shanghai)Co.,Ltd
  6. * @license http://kodcloud.com/tools/licenses/license.txt
  7. *------
  8. * 字符串加解密类;
  9. * 一次一密;且定时解密有效
  10. * 可用于加密&动态key生成
  11. * demo:  
  12. * 加密:echo Mcrypt::encode('abc','123');
  13. * 解密:echo Mcrypt::decode('9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ','123');
  14. */

  15. class Mcrypt{
  16.   public $default_key = 'a!takA:dlmcldEv,e';
  17.   
  18.   /**
  19.    * 字符加密,一次一密,可定时解密有效
  20.    *
  21.    * @param string $string 原文
  22.    * @param string $key 密钥
  23.    * @param int $expiry 密文有效期,单位s,0 为永久有效
  24.    * @return string 加密后的内容
  25.    */
  26.   public static function encode($string,$key = '', $expiry = 0){
  27.     $ckeyLength = 4;
  28.     $key = md5($key ? $key : $this->default_key); //解密密匙
  29.     $keya = md5(substr($key, 0, 16));     //做数据完整性验证  
  30.     $keyb = md5(substr($key, 16, 16));     //用于变化生成的密文 (初始化向量IV)
  31.     $keyc = substr(md5(microtime()), - $ckeyLength);
  32.     $cryptkey = $keya . md5($keya . $keyc);  
  33.     $keyLength = strlen($cryptkey);
  34.     $string = sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string . $keyb), 0, 16) . $string;
  35.     $stringLength = strlen($string);

  36.     $rndkey = array();  
  37.     for($i = 0; $i <= 255; $i++) {  
  38.       $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
  39.     }

  40.     $box = range(0, 255);  
  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.     $result = '';
  50.     for($a = $j = $i = 0; $i < $stringLength; $i++) {
  51.       $a = ($a + 1) % 256;
  52.       $j = ($j + $box[$a]) % 256;
  53.       $tmp = $box[$a];
  54.       $box[$a] = $box[$j];
  55.       $box[$j] = $tmp;
  56.       $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  57.     }
  58.     $result = $keyc . str_replace('=', '', base64_encode($result));
  59.     $result = str_replace(array('+', '/', '='),array('-', '_', '.'), $result);
  60.     return $result;
  61.   }

  62.   /**
  63.    * 字符解密,一次一密,可定时解密有效
  64.    *
  65.    * @param string $string 密文
  66.    * @param string $key 解密密钥
  67.    * @return string 解密后的内容
  68.    */
  69.   public static function decode($string,$key = '')
  70.   {
  71.     $string = str_replace(array('-', '_', '.'),array('+', '/', '='), $string);
  72.     $ckeyLength = 4;
  73.     $key = md5($key ? $key : $this->default_key); //解密密匙
  74.     $keya = md5(substr($key, 0, 16));     //做数据完整性验证  
  75.     $keyb = md5(substr($key, 16, 16));     //用于变化生成的密文 (初始化向量IV)
  76.     $keyc = substr($string, 0, $ckeyLength);
  77.     $cryptkey = $keya . md5($keya . $keyc);  
  78.     $keyLength = strlen($cryptkey);
  79.     $string = base64_decode(substr($string, $ckeyLength));
  80.     $stringLength = strlen($string);

  81.     $rndkey = array();  
  82.     for($i = 0; $i <= 255; $i++) {  
  83.       $rndkey[$i] = ord($cryptkey[$i % $keyLength]);
  84.     }

  85.     $box = range(0, 255);
  86.     // 打乱密匙簿,增加随机性
  87.     for($j = $i = 0; $i < 256; $i++) {
  88.       $j = ($j + $box[$i] + $rndkey[$i]) % 256;
  89.       $tmp = $box[$i];
  90.       $box[$i] = $box[$j];
  91.       $box[$j] = $tmp;
  92.     }
  93.     // 加解密,从密匙簿得出密匙进行异或,再转成字符
  94.     $result = '';
  95.     for($a = $j = $i = 0; $i < $stringLength; $i++) {
  96.       $a = ($a + 1) % 256;
  97.       $j = ($j + $box[$a]) % 256;
  98.       $tmp = $box[$a];
  99.       $box[$a] = $box[$j];
  100.       $box[$j] = $tmp;
  101.       $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  102.     }
  103.     if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0)
  104.     && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)
  105.     ) {
  106.       return substr($result, 26);
  107.     } else {
  108.       return '';
  109.     }
  110.   }
  111. }
复制代码






上一篇:海贼王全套资源(动画/漫画)
下一篇:QQ改会员图标,自慰仅自己可见
您需要登录后才可以回帖 登录 | 注册用户

本版积分规则

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