分享几种好用的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截取utf-8中文字符串乱码的解决方法
Mar 29 PHP
PHP+Mysql+jQuery实现发布微博程序 jQuery篇
Oct 08 PHP
关于二级目录拖拽排序的实现(源码示例下载)
Apr 26 PHP
PHP生成验证码时“图像因其本身有错无法显示”的解决方法
Aug 07 PHP
php中addslashes函数与sql防注入
Nov 17 PHP
php防止恶意刷新与刷票的方法
Nov 21 PHP
PHP读取txt文本文件并分页显示的方法
Mar 11 PHP
最准确的php截取字符串长度函数
Oct 29 PHP
在php中设置session用memcache来存储的方法总结
Jan 14 PHP
Symfony2使用Doctrine进行数据库查询方法实例总结
Mar 18 PHP
thinkphp框架下实现登录、注册、找回密码功能
Apr 06 PHP
laravel自定义分页效果
Jul 23 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实现异步操作的研究
2013/02/03 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
2016/11/09 PHP
张孝祥JavaScript学习阶段性总结(2)--(X)HTML学习
2007/02/03 Javascript
jquery 中的each()跳出循环的语句
2014/05/23 Javascript
一款由jquery实现的整屏切换特效
2014/09/15 Javascript
浅谈jQuery.easyui的datebox格式化时间
2015/06/25 Javascript
javascript实现动态统计图开发实例
2015/11/21 Javascript
js 弹出对话框(遮罩)透明,可拖动的简单实例
2016/07/11 Javascript
BOM系列第三篇之定时器应用(时钟、倒计时、秒表和闹钟)
2016/08/17 Javascript
JS控制div跳转到指定的位置的几种解决方案总结
2016/11/05 Javascript
jQuery动态生成表格及右键菜单功能示例
2017/01/13 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
NodeJS有难度的面试题(能答对几个)
2019/10/09 NodeJs
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
React中获取数据的3种方法及优缺点
2020/02/18 Javascript
JS highcharts实现动态曲线代码示例
2020/10/16 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
[15:28]DOTA2 HEROS教学视频教你分分钟做大人-剧毒术士
2014/06/13 DOTA
[01:04:05]Mineski vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
在Python中测试访问同一数据的竞争条件的方法
2015/04/23 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
python实现AES加密解密
2019/03/28 Python
python绘制随机网络图形示例
2019/11/21 Python
pandas 中对特征进行硬编码和onehot编码的实现
2019/12/20 Python
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
关爱留守儿童倡议书
2014/04/15 职场文书
投资协议书范本
2014/04/21 职场文书
秋天的图画教学反思
2014/05/01 职场文书
医师定期考核实施方案
2014/05/07 职场文书
北京申奥口号
2014/06/19 职场文书
税务干部群众路线教育实践活动对照检查材料
2014/09/20 职场文书
党支部三会一课计划
2014/09/24 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
2015年大学学生会工作总结
2015/05/13 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
php中配置文件保存修改操作 如config.php文件的读取修改等操作
2021/05/12 PHP