<?php
namespace App\Service; /*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/licenses/license.txt
*------
* 字符串加解密类;
* 一次一密;且定时解密有效
* 可用于加密&动态key生成
* demo:
* 加密:echo Mcrypt::encode('abc','123');
* 解密:echo Mcrypt::decode('9f843I0crjv5y0dWE_-uwzL_mZRyRb1ynjGK4I_IACQ','123');
*/ class Mcrypt{
private static $default_key = 'a!takA:d1989lmc1988ldEv,e'; /**
* 字符加密,一次一密,可定时解密有效
*
* @param string $string 原文
* @param string $key 密钥
* @param int $expiry 密文有效期,单位s,0 为永久有效
* @return string 加密后的内容
*/
public static function encode($string,$key = '', $expiry = ){
$ckeyLength = ;
$key = md5($key ? $key : self::$default_key); //解密密匙
$keya = md5(substr($key, , )); //做数据完整性验证
$keyb = md5(substr($key, , )); //用于变化生成的密文 (初始化向量IV)
$keyc = substr(md5(microtime()), - $ckeyLength);
$cryptkey = $keya . md5($keya . $keyc);
$keyLength = strlen($cryptkey);
$string = sprintf('%010d', $expiry ? $expiry + time() : ).substr(md5($string . $keyb), , ) . $string;
$stringLength = strlen($string); $rndkey = array();
for($i = ; $i <= ; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $keyLength]);
} $box = range(, );
// 打乱密匙簿,增加随机性
for($j = $i = ; $i < ; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % ;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 加解密,从密匙簿得出密匙进行异或,再转成字符
$result = '';
for($a = $j = $i = ; $i < $stringLength; $i++) {
$a = ($a + ) % ;
$j = ($j + $box[$a]) % ;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % ]));
}
$result = $keyc . str_replace('=', '', base64_encode($result));
$result = str_replace(array('+', '/', '='),array('-', '_', '.'), $result);
return $result;
} /**
* 字符解密,一次一密,可定时解密有效
*
* @param string $string 密文
* @param string $key 解密密钥
* @return string 解密后的内容
*/
public static function decode($string,$key = '')
{
$string = str_replace(array('-', '_', '.'),array('+', '/', '='), $string);
$ckeyLength = ;
$key = md5($key ? $key : self::$default_key); //解密密匙
$keya = md5(substr($key, , )); //做数据完整性验证
$keyb = md5(substr($key, , )); //用于变化生成的密文 (初始化向量IV)
$keyc = substr($string, , $ckeyLength);
$cryptkey = $keya . md5($keya . $keyc);
$keyLength = strlen($cryptkey);
$string = base64_decode(substr($string, $ckeyLength));
$stringLength = strlen($string); $rndkey = array();
for($i = ; $i <= ; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $keyLength]);
} $box = range(, );
// 打乱密匙簿,增加随机性
for($j = $i = ; $i < ; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % ;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 加解密,从密匙簿得出密匙进行异或,再转成字符
$result = '';
for($a = $j = $i = ; $i < $stringLength; $i++) {
$a = ($a + ) % ;
$j = ($j + $box[$a]) % ;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % ]));
}
if ((substr($result, , ) == || substr($result, , ) - time() > )
&& substr($result, , ) == substr(md5(substr($result, ) . $keyb), , )
) {
return substr($result, );
} else {
return '';
}
}
}

php 简单加密解密的更多相关文章

  1. JavaSE——装饰设计模式+简单加密解密工程

    2019独角兽企业重金招聘Python工程师标准>>> 声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权:凯哥学堂旨在促进VIP学员互相学习的基础 ...

  2. 用C语言简单加密解密

    使用char表示的字符型数据,在本质上与我们前面介绍的整型数据并无太大的区别,只是char类型占用的内存字节数更小,能够表示的数据范围更小而已.在使用上,char被专门用来表示C语言的字符集中的各种字 ...

  3. c# 如何利用异或运算进行简单加密解密

    利用“^”异或运算对字符串进行加密 原理:按位做“异或”运算是->位值相同得1,不同得0,如下计算 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 0 ^ 0 = 0 例如: < ...

  4. AES简单加密解密的方法实现

    package com.mstf.aes; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyEx ...

  5. webconfig简单加密解密

    <?xml version="1.0"?><configuration> <configSections> <section name=& ...

  6. SQL SERVER 数据库字段简单加密解密

    --------加密函数----------- )) RETURNS varbinary(max) AS BEGIN declare @pwd varbinary(max) SELECT @pwd = ...

  7. Python_字符串简单加密解密

    def crypt(source,key): from itertools import cycle result='' temp=cycle(key) for ch in source: resul ...

  8. Java实现一个简单的加密解密方法

    Crypto是Java语言写的一个简单的加密解密方法. 使用方法: 加密方法 String cipherte=Enande.encrypt(content, pass): 解密方法 Enande.de ...

  9. 简单的JavaScript字符串加密解密

    简单的JavaScript字符串加密解密 <div> <input type="text" id="input" autofocus=&quo ...

随机推荐

  1. Mysql千万级数据性能调优配置

    背景: 笔者的源数据一张表大概7000多万条,数据大小36G,索引6G,加起来表空间有40G+,类似的表有4张,总计2亿多条 数据库mysql,引擎为innodb,版本5.7,服务器内存256G,物理 ...

  2. 05_Hibernate数据库连接池

    一.配置连接池 连接池:连接池是创建和管理数据库连接的缓冲池技术. 优点:合理利用数据库连接资源.简化的编程模式.受控的资源使用. 主流连接池: DBCP(DataBase connection po ...

  3. Ajax请求Session超时解决

    web前端js代码: $.ajaxSetup({ contentType : "application/x-www-form-urlencoded;charset=utf-8", ...

  4. 两队列模拟一个栈,python实现

    python实现两个队列模拟一个栈: class Queue(object): def __init__(self): self.stack1=[] self.stack2=[] def enqueu ...

  5. day72作业

    目录 models模型类 路由配置 视图配置 序列化组件配置 基于ModelSerializer类,完成Car资源的单查,群查,单增接口 序列化:显示车名,车的颜色,车的价格,车的海报,车的品牌 反序 ...

  6. get请求中文乱码

    get请求时要将url进行encodeURI http://www.ruanyifeng.com/blog/2010/02/url_encoding.html http://www.ruanyifen ...

  7. Thinkphp 加载更多

    要实现的效果是这样的: 每次点击显示更多按钮,都会往下显示2条数据,直到后面没有数据了.. 数据表: articleList模板文件 <include file="./Applicat ...

  8. 简单易学的机器学习算法——基于密度的聚类算法DBSCAN

    一.基于密度的聚类算法的概述     最近在Science上的一篇基于密度的聚类算法<Clustering by fast search and find of density peaks> ...

  9. jqGrid 属性、事件全集

    <html> ... <table id="list1"></table> <div id="pager1">& ...

  10. Django之ORM多表操作

    1.创建一对多: 1.外键建在多的一方(如:一个出版社可出版多本书,所以建在书的表) 2.创建表: 1.创建外键 2.关联的表名 2.一对多数据的操作 2.1数据的添加: 第一种方法: 第二种方法: ...