分享几种好用的PHP自定义加密函数(可逆/不可逆)


Posted in PHP onSeptember 15, 2020

项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这些加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理。最常见的应用在用户登录以及一些API数据交换的场景。最常见的应用在用户登录以及一些API数据交换的场景。加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果。

u=3837593897,2803417633&fm=26&gp=0.jpg

废话不多说,直接上代码。

一、第一种针对于ID的可逆加密函数,也可以用作于邀请码之类的,解密后的数据比较简单

示例:lockcode(28)=》000X unlockcode('000X')=》28

//加密函数
function lockcode($code) {
 static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
 $num = $code;
 $code = '';
 while ( $num > 0) {
  $mod = $num % 35;
  $num = ($num - $mod) / 35;
  $code = $source_string[$mod].$code;
 }
 if(empty($code[3]))
  $code = str_pad($code,4,'0',STR_PAD_LEFT);
 return $code;
}
//解密函数
function unlockcode($code) {
 static $source_string = 'E5FCDG3HQA4B1NOPIJ2RSTUV67MWX89KLYZ';
 if (strrpos($code, '0') !== false)
  $code = substr($code, strrpos($code, '0')+1);
 $len = strlen($code);
 $code = strrev($code);
 $num = 0;
 for ($i=0; $i < $len; $i++) {
  $num += strpos($source_string, $code[$i]) * pow(35, $i);
 }
 return $num;
}

二、第二种是加密函数是我在网上搜索来的,很好用,可逆加密,支持盐值参数

示例:encrypt('abcd','1234')=》nkiV93IfJ decrypt('nkiV93IfJ','1234')=》abcd

//加密函数 
function encrypt($data,$key='CHENI'){ 
 $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 
 $nh = rand(0,64); 
 $ch = $chars[$nh]; 
 $mdKey = md5($key.$ch); 
 $mdKey = substr($mdKey,$nh%8, $nh%8+7); 
 $data= base64_encode($data); 
 $tmp = ''; 
 $i=0;$j=0;$k = 0; 
 for ($i=0; $i<strlen($data); $i++) { 
  $k = $k == strlen($mdKey) ? 0 : $k; 
  $j = ($nh+strpos($chars,$data[$i])+ord($mdKey[$k++]))%64; 
  $tmp .= $chars[$j]; 
 } 
 return urlencode($ch.$tmp); 
}
//解密函数 
function decrypt($data,$key='CHENI'){
 $txt = urldecode($data); 
 $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; 
 $ch = $txt[0]; 
 $nh = strpos($chars,$ch); 
 $mdKey = md5($key.$ch); 
 $mdKey = substr($mdKey,$nh%8, $nh%8+7); 
 $txt = substr($txt,1); 
 $tmp = ''; 
 $i=0;$j=0; $k = 0; 
 for ($i=0; $i<strlen($txt); $i++) { 
  $k = $k == strlen($mdKey) ? 0 : $k; 
  $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]); 
  while ($j<0) $j+=64; 
  $tmp .= $chars[$j]; 
 } 
 return base64_decode($tmp); 
}

三、第三种跟上面的比较类似,也支持盐值参数

示例:encrypt('abcd','1234')=》mZPHxw== decrypt('mZPHxw==','1234')=》abcd

function encrypt($data, $key) { 
 $char="";
 $str="";
 $key = md5($key); 
 $x  = 0; 
 $len = strlen($data); 
 $l  = strlen($key); 
 for ($i = 0; $i < $len; $i++) { 
  if ($x == $l) { $x = 0; } 
  $char .= $key{$x}; 
  $x++; 
 } 
 for ($i = 0; $i < $len; $i++){ 
  $str .= chr(ord($data{$i}) + (ord($char{$i})) % 256); 
 } 
 return base64_encode($str); 
} 
function decrypt($data, $key) { 
 $key = md5($key); 
 $x = 0; 
 $data = base64_decode($data); 
 $len = strlen($data); 
 $l = strlen($key); 
 for ($i = 0; $i < $len; $i++) { 
  if ($x == $l){ $x = 0;} 
  $char .= substr($key, $x, 1); 
  $x++; 
 } 
 for ($i = 0; $i < $len; $i++){ 
  if (ord(substr($data, $i, 1)) < ord(substr($char, $i, 1))){ 
   $str .= chr((ord(substr($data, $i, 1)) + 256) - ord(substr($char, $i, 1))); 
  }else{ 
   $str .= chr(ord(substr($data, $i, 1)) - ord(substr($char, $i, 1))); 
  } 
 } 
 return $str; 
}

四、这个是我用过最好用的一个了,discuz中使用的加密解密算法

//加密算法
 function authcode($string,$key='',$operation=false,$expiry=0){
  $ckey_length = 4;
  $key = md5($key ? $key : DEFAULT_KEYS);
  $keya = md5(substr($key, 0, 16));
  $keyb = md5(substr($key, 16, 16));
  $keyc = $ckey_length ? ($operation? substr($string, 0, $ckey_length):substr(md5(microtime()), -$ckey_length)) : '';
  $cryptkey = $keya.md5($keya.$keyc);
  $key_length = strlen($cryptkey);
  $string = $operation? base64_decode(substr($string, $ckey_length)) :
  sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
  $string_length = strlen($string);
  $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 < $string_length; $i++) {
   $a = ($a + 1) % 256;
   $j = ($j + $box[$a]) % 256;
   $tmp = $box[$a];
   $box[$a] = $box[$j];
   $box[$j] = $tmp;
   $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
  }
  if($operation) {
   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 substr($result, 26);
   } else {
    return '';
   }
  } else {
   return $keyc.str_replace('=', '', base64_encode($result));
  }
 }
 echo authcode('123456','key');
 echo '<br>';
 echo authcode('7d49kn9k07uSBZvha8as+/qm4UoLfpy88PFg12glPeDtlzc','key',true);

以上几种都是比较好用且是我自己常用的分享给大家,大家如果想要了解其他的加密函数或者有什么建议可以在底部留言。

PHP 相关文章推荐
PHP的开合式多级菜单程序
Oct 09 PHP
php使用codebase生成随机数
Mar 25 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
php简单统计在线人数的方法
May 10 PHP
PHP二维数组矩形转置实例
Jul 20 PHP
yii2高级应用之自定义组件实现全局使用图片上传功能的方法
Oct 08 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
ThinkPHP整合datatables实现服务端分页的示例代码
Feb 10 PHP
实现php删除链表中重复的结点
Sep 27 PHP
laravel5使用freetds连接sql server的方法
Dec 07 PHP
Laravel访问出错提示:`Warning: require(/vendor/autoload.php): failed to open stream: No such file or di解决方法
Apr 02 PHP
Laravel 框架控制器 Controller原理与用法实例分析
Apr 14 PHP
PhpStorm+xdebug+postman调试技巧分享
Sep 15 #PHP
laravel中Redis队列监听中断的分析
Sep 14 #PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 #PHP
PHP $O00OO0=urldecode &amp; eval 解密,记一次商业源码的去后门
Sep 13 #PHP
PHP重载基础知识回顾
Sep 10 #PHP
PHP反射基础知识回顾
Sep 10 #PHP
PHP获取类私有属性的3种方法
Sep 10 #PHP
You might like
用PHP+java实现自动新闻滚动窗口
2006/10/09 PHP
火车头采集器3.0采集图文教程
2007/03/17 PHP
php中利用post传递字符串重定向的实现代码
2011/04/21 PHP
php常用表单验证类用法实例
2015/06/18 PHP
php 中的closure用法详解
2017/06/12 PHP
phpstudy2020搭建站点的实现示例
2020/10/30 PHP
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
悬浮广告方法日常收集整理
2016/03/18 Javascript
基于Vuejs实现购物车功能
2016/08/02 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
node.js通过axios实现网络请求的方法
2018/03/05 Javascript
让axios发送表单请求形式的键值对post数据的实例
2018/08/11 Javascript
vue中进入详情页记住滚动位置的方法(keep-alive)
2018/09/21 Javascript
vue之a-table中实现清空选中的数据
2019/11/07 Javascript
一篇文章带你使用Typescript封装一个Vue组件(简单易懂)
2020/06/05 Javascript
js实现点击选项置顶动画效果
2020/08/25 Javascript
Python实现3行代码解简单的一元一次方程
2014/08/18 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
python实现电脑自动关机
2018/06/20 Python
pandas重新生成索引的方法
2018/11/06 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
python 读取二进制 显示图片案例
2020/04/24 Python
如何配置关联Python 解释器 Anaconda的教程(图解)
2020/04/30 Python
H5 canvas中width、height和style的宽高区别详解
2018/11/02 HTML / CSS
九州传奇上机题
2014/07/10 面试题
Python使用openpyxl复制整张sheet
2021/03/24 Python
创业计划书如何吸引他人眼球
2014/01/10 职场文书
交警失职检讨书
2015/01/26 职场文书
2015年银行大堂经理工作总结
2015/04/24 职场文书
和领导吃饭祝酒词
2015/08/11 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
在HTML中引入CSS的几种方式介绍
2021/12/06 HTML / CSS
「天才王子的赤字国家重生术」妮妮姆·拉雷粘土人开订
2022/03/21 日漫