php中简单的对称加密算法实现


Posted in PHP onJanuary 05, 2017

前言

在网上找到了一个不错的PHP方面的对称加密算法;在PHP的语法环境里,有urlencode与urldecode,base64_encode和base64_decode自带的对称算法,不过这些自带的算法不能称之为加密算法,只能说是编码方式而已。可是我们可以利用这些来进行一些加工,来实现简单的加密和解密算法。

这次的加密和解密算法是使用base64的方式改编的。通常我们使用base64_encode($str)产生的字符串,不经过任何的加工的话,base64_decode()就能转回我们之前的字符串;可是如果我们在base64_encode()之后的字符串里插入几个字符呢,那他就转不回来了,即使转过来也不是我们自己的字符串。

示例代码如下:

<?php
 $content = "大家好,我是中国人,你是谁";

 /**
 * 简单对称加密算法之加密
 * @param String $string 需要加密的字串
 * @param String $skey 加密EKY
 * @return String
 */
 function encode($string = '', $skey = 'wenzi') {
 $strArr = str_split(base64_encode($string));
 $strCount = count($strArr);
 foreach (str_split($skey) as $key => $value)
  $key < $strCount && $strArr[$key].=$value;
 return str_replace(array('=', '+', '/'), array('O0O0O', 'o000o', 'oo00o'), join('', $strArr));
 }

 /**
 * 简单对称加密算法之解密
 * @param String $string 需要解密的字串
 * @param String $skey 解密KEY
 * @return String
 */
 function decode($string = '', $skey = 'wenzi') {
 $strArr = str_split(str_replace(array('O0O0O', 'o000o', 'oo00o'), array('=', '+', '/'), $string), 2);
 $strCount = count($strArr);
 foreach (str_split($skey) as $key => $value)
  $key <= $strCount && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];
 return base64_decode(join('', $strArr));
 }

 echo '<pre>';
 echo "string : " . $content . " <br />";
 echo "encode : " . ($enstring = encode($content)) . '<br />';
 echo "decode : " . decode($enstring);

 exit();

上面的算法里我们可以看到:我们把base64_encode()产生的字符中插入我们提前设定的密钥,然后再把里面的特殊字符进行替换,即使别人看到这样的字符串也不知道是什么。当然,这里我们再稍微的改进下,比如把密钥倒着插入到字符串里,密钥base64后再进行插入等等,插入密钥后再base64一次。

当然解密就是加密的反方向了,思考了一会儿才知道解密的原理:之前我们在字符串里插入了一些字符,现在解密时我们就要把他摘出来,首先把加密后的字符串按每个数组里2个元素进行分组,然后判断第二个字符是不是密钥里的,如果是,那么第一个字符就是原来base64里的字符。

总结

以上就是这篇文章的全部内容了,当然在php里除了base64实现加密和解密外,还有AES和DES等算法,有需要的朋友们可以关注三水点靠木,相信会对大家有所帮助。

PHP 相关文章推荐
php基础知识:控制结构
Dec 13 PHP
discuz论坛 用户登录 后台程序代码
Nov 27 PHP
php 字符转义 注意事项
May 27 PHP
php echo()和print()、require()和include()函数区别说明
Mar 27 PHP
php 传值赋值与引用赋值的区别
Dec 29 PHP
javascript,php获取函数参数对象的代码
Feb 03 PHP
php之curl设置超时实例
Nov 03 PHP
CentOS下PHP安装Oracle扩展
Feb 15 PHP
PHP中文竖排转换实现方法
Oct 23 PHP
TP5(thinkPHP5)框架基于ajax与后台数据交互操作简单示例
Sep 03 PHP
浅谈PHP进程管理
Mar 08 PHP
PHP创建XML接口示例
Jul 04 PHP
WAF的正确bypass
Jan 05 #PHP
phpcms的分类名称和类别名称的调用
Jan 05 #PHP
php 5.4 全新的代码复用Trait详解
Jan 05 #PHP
golang 调用 php7详解及实例
Jan 04 #PHP
PHP 与 UTF-8 的最佳实践详细介绍
Jan 04 #PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 #PHP
PHPExcel导出2003和2007的excel文档功能示例
Jan 04 #PHP
You might like
利用php实现禁用IE和火狐的缓存问题
2012/12/03 PHP
thinkphp浏览历史功能实现方法
2014/10/29 PHP
php中count获取多维数组长度的方法
2014/11/03 PHP
关于PHP中Session文件过多的问题及session文件保存位置
2016/03/17 PHP
Add a Formatted Table to a Word Document
2007/06/15 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
jquery.cookie.js 操作cookie实现记住密码功能的实现代码
2011/04/27 Javascript
Textarea根据内容自适应高度
2013/10/28 Javascript
jquery遍历之parent()和parents()的区别及parentsUntil()方法详解
2013/12/02 Javascript
Jquery跳到页面指定位置的方法
2014/05/12 Javascript
jQuery带箭头提示框tooltips插件集锦
2014/11/17 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
Bootstrap组件(一)之菜单
2016/05/11 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
JS经典正则表达式笔试题汇总
2016/12/15 Javascript
EasyUI实现下拉框多选功能
2017/11/07 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
vue动态路由配置及路由传参的方式
2018/05/23 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
[57:12]完美世界DOTA2联赛循环赛 Inki vs Matador BO2第一场 10.31
2020/11/02 DOTA
python实现类的静态变量用法实例
2015/05/08 Python
django中的HTML控件及参数传递方法
2018/03/20 Python
Python3.5局部变量与全局变量作用域实例分析
2019/04/30 Python
django基于存储在前端的token用户认证解析
2019/08/06 Python
python爬取百度贴吧前1000页内容(requests库面向对象思想实现)
2019/08/10 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
阿玛尼美妆加拿大官方商城:Giorgio Armani Beauty加拿大
2017/10/24 全球购物
在家更换处方镜片:Lensabl
2019/05/01 全球购物
这76道Java面试题及答案,祝你能成功通过面试
2016/04/16 面试题
火锅店营销方案
2014/02/26 职场文书
个人公司授权委托书范本
2014/10/12 职场文书
2014员工聘用协议书(最新版)
2014/11/24 职场文书
2014年幼儿园班级工作总结
2014/12/17 职场文书
售房协议书范本
2015/08/11 职场文书
2015年幼儿园师德师风建设工作总结
2015/10/23 职场文书