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基础知识:类与对象(2) 自动加载对象
Dec 13 PHP
PHP中Date获取时间不正确怎么办
Jun 05 PHP
浅析php中常量,变量的作用域和生存周期
Aug 10 PHP
Codeigniter整合Tank Auth权限类库详解
Jun 12 PHP
php is_writable判断文件是否可写实例代码
Oct 13 PHP
Zend Framework入门教程之Zend_Registry组件用法详解
Dec 09 PHP
php中Ioc(控制反转)和Di(依赖注入)
May 07 PHP
php基于自定义函数记录log日志方法
Jul 21 PHP
yii gridview实现时间段筛选功能
Aug 15 PHP
php实现的后台表格分页功能示例
Oct 23 PHP
Laravel中使用Queue的最基本操作教程
Dec 27 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 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对MongoDB[NoSQL]数据库的操作
2013/03/01 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
Prototype使用指南之dom.js
2007/01/10 Javascript
JavaScript的parseInt 取整使用
2011/05/09 Javascript
一些实用的jQuery代码片段收集
2011/07/12 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
页面js遇到乱码问题的解决方法是和无法转码的情况
2014/04/30 Javascript
更快的异步执行(setTimeout多浏览器)
2014/08/12 Javascript
JS小游戏之极速快跑源码详解
2014/09/25 Javascript
JavaScript动态改变表格单元格内容的方法
2015/03/30 Javascript
js实现新浪微博首页效果
2015/10/16 Javascript
javascript类型系统 Array对象学习笔记
2016/01/09 Javascript
javascript 注释代码的几种方法总结
2017/01/04 Javascript
vue.js学习之UI组件开发教程
2017/07/03 Javascript
ant design vue导航菜单与路由配置操作
2020/10/28 Javascript
[01:01:25]DOTA2上海特级锦标赛B组资格赛#2 Fnatic VS Spirit第三局
2016/02/27 DOTA
[40:31]Secret vs Alliacne 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
python定时执行指定函数的方法
2015/05/27 Python
python批量修改图片大小的方法
2018/07/24 Python
python如何提升爬虫效率
2020/09/27 Python
python 基于selenium实现鼠标拖拽功能
2020/12/24 Python
我想声明一个指针并为它分配一些空间, 但却不行。这些代码有什么 问题?char *p; *p = malloc(10);
2016/10/06 面试题
手术室护士自我鉴定
2013/10/14 职场文书
个人简历自我评价
2014/02/02 职场文书
小学英语教学反思案例
2014/02/04 职场文书
优秀高中生事迹材料
2014/02/11 职场文书
网站创业计划书
2014/04/30 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
校园会短篇的广播稿
2014/10/21 职场文书
2015年度护士个人工作总结
2015/04/09 职场文书
大学生学习十八届五中全会精神心得体会
2016/01/05 职场文书
导游词之珠海轮廓
2019/10/25 职场文书
用golang如何替换某个文件中的字符串
2021/04/25 Golang
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
python中的sys模块和os模块
2022/03/20 Python