分享几种好用的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 01 PHP
DEDE采集大师官方留后门的删除办法
Jan 08 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
PHP 万年历实现代码
Oct 18 PHP
php socket客户端及服务器端应用实例
Jul 04 PHP
php实现设计模式中的单例模式详解
Oct 11 PHP
微信公众号开发之微信公共平台消息回复类实例
Nov 14 PHP
新浪微博OAuth认证和储存的主要过程详解
Mar 27 PHP
Yii2 队列 shmilyzxt/yii2-queue 简单概述
Aug 02 PHP
phpStudy配置多站点多域名方法及遇到的403错误解决方法
Oct 19 PHP
PHP生成推广海报的方法分享
Apr 22 PHP
ThinkPHP框架实现导出excel数据的方法示例【基于PHPExcel】
May 12 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创建session的方法实例详解
2015/01/27 PHP
THINKPHP支持YAML配置文件的设置方法
2015/03/17 PHP
php array_reverse 以相反的顺序返回数组实例代码
2017/04/11 PHP
PHP实现文件上传功能实例代码
2017/05/18 PHP
Laravel 手动开关 Eloquent 修改器的操作方法
2019/12/30 PHP
JQuery 无废话系列教程(二) jquery实战篇上
2009/06/23 Javascript
JavaScript null和undefined区别分析
2009/10/14 Javascript
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
JS替换字符串中空格方法
2015/04/17 Javascript
Express实现前端后端通信上传图片之存储数据库(mysql)傻瓜式教程(一)
2015/12/10 Javascript
Bootstrap Scrollspy源码学习
2017/03/02 Javascript
详解webpack 入门与解析
2018/04/09 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
详解关于表格合并span-method方法的补充(表格数据由后台动态返回)
2019/05/21 Javascript
原生js实现的观察者和订阅者模式简单示例
2020/04/18 Javascript
python实现排序算法
2014/02/14 Python
自己使用总结Python程序代码片段
2015/06/02 Python
python魔法方法-自定义序列详解
2016/07/21 Python
python搭建虚拟环境的步骤详解
2016/09/27 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
Python中装饰器学习总结
2018/02/10 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
python 使用 requests 模块发送http请求 的方法
2018/12/09 Python
python调用staf自动化框架的方法
2018/12/26 Python
CSS3 3D酷炫立方体变换动画的实现
2019/03/26 HTML / CSS
css3实现文字首尾衔接跑马灯的示例代码
2020/10/16 HTML / CSS
Html5调用手机摄像头并实现人脸识别的实现
2018/12/21 HTML / CSS
日本最大美瞳直送网:Morecontact(中文)
2019/04/03 全球购物
仓库组长岗位职责
2014/01/29 职场文书
巾帼标兵事迹材料
2014/12/26 职场文书
学生党员检讨书范文
2014/12/27 职场文书
2015年依法行政工作总结
2015/04/29 职场文书
管辖权异议上诉状
2015/05/23 职场文书
用人单位的规章制度,怎样制定才是有效的?
2019/07/09 职场文书
用Python实现Newton插值法
2021/04/17 Python