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

项目中有时我们需要使用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);

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

(0)

相关推荐

  • php中加密解密DES类的简单使用方法示例

    本文实例讲述了php中加密解密DES类的简单使用方法.分享给大家供大家参考,具体如下: 在平时的开发工作中,我们经常会对关键字符进行加密,可能为了安全 也可能为了规范,所以要正确使用DES加密解密 代码1: class DES { var $key; // 密钥 var $iv; // 偏移量 function __construct( $key, $iv=0 ) { $this->key = $key; if( $iv == 0 ) { $this->iv = $key; } else {

  • php自定义加密与解密程序实例

    本文实例讲述了php自定义加密与解密程序.分享给大家供大家参考.具体分析如下: PHP3 Cryption是一个非常容易被破解,不安全的加密功能,不应该是非常重要的东西用,虽然加密是好的,它不会阻碍对尖端开裂程序的严格考验. 不过,试试吧...这是一个伟大的方式来加密和解密字符串.与许多隐窝功能,这是双向的.基于一个密码,您可以加密或解密.您也可以解密或加密过无数次,通过循环或其他方法.字母表中的字符也是变化的.所有这些事情让你修改和巩固加密. 关于这最佳的部分?您可以加密与解密或一张纸和一支铅

  • PHP实现的AES加密、解密封装类与用法示例

    本文实例讲述了PHP实现的AES加密.解密封装类与用法.分享给大家供大家参考,具体如下: <?php /** * Class AES * 用于AES加解密数据 * time:2018-04-27 */ class AES { protected $cipher = MCRYPT_RIJNDAEL_256; //AES加密算法 protected $mode = MCRYPT_MODE_CBC; //采用cbc加密模式 protected $key; //密钥 protected $iv; //c

  • PHP使用自定义key实现对数据加密解密的方法

    本文实例讲述了PHP使用自定义key实现对数据加密解密的方法.分享给大家供大家参考,具体如下: 客户端和服务端通信时,有个场景很常见,通过一个id作为url参数来回传递.假设现在业务上只有这个id标识,那么需要稍微安全一点的通信,对这个id进行加密传输,到服务端再进行解密.这里需要一个服务端进行保密的key,利用这个key进行加密和解密. 加解密的方法如下:$str是需要加解密的字符串,$key是自己定义的一个key // 加密 function encryptStr($str, $key){

  • PHP实现基于3DES算法加密解密字符串示例

    本文实例讲述了PHP实现基于3DES算法加密解密字符串.分享给大家供大家参考,具体如下: 3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计算机运算能力的增强,原版DES密码的密钥长度变得容易被暴力破解:3DES即是设计用来提供一种相对简单的方法,即通过增加DES的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法. 项目地址:https:/

  • 基于PHP实现解密或加密Cloudflar邮箱保护

    Cloudflare 有一项功能挺不错的,就是将页面上所有的邮箱地址都加密起来,防止机器人抓到然后干坏事. 这项功能要在后台开启 email address obfuscation 之后就可以在页面上加入一个邮箱地址,比如说 abc@abc.com 查看源代码就能发现类似如下的代码 <a class="__cf_email__" data-cfemail="30515253705152531e535f5d" href="/cdn-cgi/l/emai

  • php实现的rc4加密解密类定义与用法示例

    本文实例讲述了php实现的rc4加密解密类.分享给大家供大家参考,具体如下: class.rc4crypt.php文件: <?php /* * By julying.com */ define('CRYPT_RC4_MODE_INTERNAL', 1); define('CRYPT_RC4_MODE_MCRYPT', 2); define('CRYPT_RC4_ENCRYPT', 0); define('CRYPT_RC4_DECRYPT', 1); class Crypt_RC4 { /**

  • PHP实现的XXTEA加密解密算法示例

    本文实例讲述了PHP实现的XXTEA加密解密算法.分享给大家供大家参考,具体如下: <?php /** * Xxtea 加密实现类 */ class xxtea { private function long2str($v, $w) { $len = count($v); $n = ($len -1) << 2; if ($w) { $m = $v[$len -1]; if (($m < $n -3) || ($m > $n)) return false; $n = $m;

  • php的RSA加密解密算法原理与用法分析

    本文实例讲述了php的RSA加密解密算法原理与用法.分享给大家供大家参考,具体如下: 最近因为工作的需要,要倒腾支付宝支付相关的知识,因为支付宝应用了RSA加密机制,个人对此并不了解,所以在这里写下一篇总结. 1.生成公钥和私钥 要应用RSA算法,必须先生成公钥和私钥,公钥和私钥的生成可以借助openssl工具. 本次测验是在windows下进行的,可以到以下的地址下载windows安装包:http://gnuwin32.sourceforge.net/packages/openssl.htm,

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

    项目中有时我们需要使用PHP将特定的信息进行加密,也就是通过加密算法生成一个加密字符串,这些加密后的字符串可以通过解密算法进行解密,便于程序对解密后的信息进行处理.最常见的应用在用户登录以及一些API数据交换的场景.最常见的应用在用户登录以及一些API数据交换的场景.加密解密原理一般都是通过一定的加密解密算法,将密钥加入到算法中,最终得到加密解密结果. u=3837593897,2803417633&fm=26&gp=0.jpg 废话不多说,直接上代码. 一.第一种针对于ID的可逆加密函数

  • 分享几种比较简单实用的JavaScript tabel切换

    闲着没事,随便写了个简单的JavaScript tabel切换,大家有兴趣的看看,有需要的就拿去吧.废话不说了,大家看代码吧 方法一:for循环+if判断当前点击与自定义数组是否匹配 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>tab切换</title> <style type="te

  • Springboot Druid 自定义加密数据库密码的几种方案

    前言 开发过程中,配置的数据库密码通常是明文形式,这样首先第一个安全性不好(相对来说),不符合一个开发规范(如项目中不能出现明文账号密码),其实就是当出现特殊需求时,比如要对非运维人员开方服务器部分权限,但是又涉及项目部署的目录时,容易泄漏数据库密码,虽然一般生产环境中,数据库往往放入内网,访问只能通过内网访问,但是不管怎么说账号密码直接让人知道总归不好,甚至有些项目需要部署到客户环境中,但是可能共用一个公共数据库(数据库只向指定服务器开放外网端口或组建内网环境),这样的情况下,如果数据库密码再

  • 分享jQuery3种常见事件监听方式

    目录 1.HTML标签内联事件 2.用JavaScript实现事件监听 3.用jQuery实现事件监听 前言: 在 Web 页面经常会有各种事件发生,事件发生后需要进行一些特定处理,即执行特定的函数或者语句.这就需要对事件进行监听,监听事件的常见方式有以下三种,本文将通过实例来具体介绍. 1.HTML标签内联事件 实例1:单击页面 "Hello" 按钮,弹出提示框显示 Hello world! <!doctype html> <html> <head>

  • 分享几种python 变量合并方法

    目录 一.list 合并 二.str 合并 三.dict 合并 一.list 合并 第一种方法: a =[91,95,97,99] b =[92,93,96,98] c = a+b  # 合并 c.sort()  # 排序  正序 print(c) c.sort(reverse=True)  # 排序  倒序 print(c) 第二种方法: a =[91,95,97,99] b =[92,93,96,98] a[0:0] = b # 合并 a.sort() print(a) 第三种方法: a =

  • jQuery自定义动画函数实例详解(附demo源码)

    本文实例讲述了jQuery自定义动画函数完整实现技巧.分享给大家供大家参考,具体如下: 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/jquery-zdy-dh-move-style-demo/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.d

  • js自定义trim函数实现删除两端空格功能

    本文实例讲述了js自定义trim函数实现删除两端空格功能.分享给大家供大家参考,具体如下: 兼容IE低版本浏览器,以及其他一些低版本脚本的浏览器 js中本身是没有trim函数的 //删除左右两端的空格 function trim(str){ return str.replace(/(^\s*)|(\s*$)/g, ""); } //删除左边的空格 function ltrim(str){ return str.replace(/(^\s*)/g,""); } //删

  • django之导入并执行自定义的函数模块图解

    1.现在有一个需求:我想在monitor应用中导入data文件夹下的apolos.py中的tes()函数并执行. 打开monitor应用的视图,由于django项目的根路径是从项目开始的,所以直接 from data.apolos import * 就可以 把apolos.py文件中的所有函数导入.下面的list_num = tes()就可以执行自定义的功能,这样写的好处是把一部分功能移到了外部,简化了views视图函数,优化代码. 补充知识:当import独立于django项目文件夹以外文件夹

  • keras自定义回调函数查看训练的loss和accuracy方式

    前言: keras是一个十分便捷的开发框架,为了更好的追踪网络训练过程中的损失函数loss和准确率accuracy,我们有几种处理方式,第一种是直接通过 history=model.fit(),来返回一个history对象,通过这个对象可以访问到训练过程训练集的loss和accuracy以及验证集的loss和accuracy. 第二种方式就是通过自定义一个回调函数Call backs,来实现这一功能,本文主要讲解第二种方式. 一.如何构建回调函数Callbacks 本文所针对的例子是卷积神经网络

  • 分享5个数据处理更加灵活的pandas调用函数方法

    目录 0. 数据预览 1. apply 2. applymap 3. map 4. agg 5. pipe 0. 数据预览 这里的数据是虚构的语数外成绩,大家在演示的时候拷贝一下就好啦. import pandas as pd df = pd.read_clipboard() df 姓名 语文 数学 英语 性别 总分 0 才哥 91 95 92 1 1 小明 82 93 91 1 2 小华 82 87 94 1 3 小草 96 55 88 0 4 小红 51 41 70 0 5 小花 58 59

随机推荐