PHP对称加密函数实现数据的加密解密


Posted in PHP onOctober 27, 2016

项目中有一个地方用到了将用户ID加密、传至下个接点进行反解的需求。(原谅我不能透漏太多-_-!),第一个想到的就是康盛Ucenter中的一个函数,后来搜了下,在简明魔法中也找到了个简单的方法,遂整合了下,形成了自己使用的函数。

一、对称加密

发送方将明文使用密钥和算法处理成密文发送出去,接收方使用密钥和算法将密文处理成明文,发收信双方使用同一个密钥对数据进行加密和解密。

PHP对称加密函数实现数据的加密解密

因为使用同一个密钥加密、解密,所以安全性上不仅与算法有关,密钥的安全也很重要。

当然并不是密钥越复杂越好,相反密钥通常比较小的,因为虽然密钥越大,加密越强,但加密与解密的过程越慢,所以密钥的大小既要照顾到安全性,也要照顾到效率。

毕竟对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高,没了效率高这一优势,还不如直接用非对称加密。

此外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的惟一钥匙,这会使得发收信双方所拥有的钥匙数量呈几何级数增长,密钥管理成为用户的负担。

对称加密算法在分布式网络系统上使用较为困难,主要是因为密钥管理困难,使用成本较高。

二、非对称加密

非对称加密相对来说,就安全很多了,它使用了一对密钥,公开密钥和私有密钥,分别用来进行加密和解密。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。

PHP对称加密函数实现数据的加密解密

最常见的非对称加密,应该就是银行系统,支付平台了。比如我们申请支付宝或者银联支付的接口时,会得到一个公钥,商城中进行支付是,用公钥将信息加密提交给平台,平台使用密钥对你的信息解密,进行支付操作等。

虽然非对称加密很安全,但是和对称加密比起来,它非常的慢,所以我们一般处理的话,大部分是用对称加密来传送消息,但对称加密所使用的密钥我们可以通过非对称加密的方式发送出去,回想一下你申请到的支付接口,是不是给了你一对密钥呢?^.^

三、结合使用

对称性加密速度快,发送大量数据时用比较好。非对称加密加密和解密花费时间长、速度慢,只适合对少量数据进行加密,但是,非对称加密的安全性是极高的。

扬长避短:将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

PHP对称加密函数实现数据的加密解密

项目中使用的方法不宜透露,只在这里列出两个其他的例子吧。第一个是ucenter中的,第二个是简明魔法中看到的。

需要注意的是,由于是base64算法,加密后的字符串有可能会出现 + \ ,如果是用在url中,是不友好的,可以在外部或改下方法,正则验证递归调取下。

/**
 * 字符串加密以及解密函数
 * @param string $string 原文或者密文
 * @param string $operation 操作(ENCODE | DECODE), 默认为 DECODE
 * @param string $key 密钥
 * @param int $expiry 密文有效期, 加密时候有效, 单位 秒,0 为永久有效
 * @return string 处理后的 原文或者 经过 base64_encode 处理后的密文
 */
function _authcode ($string, $operation = 'DECODE', $key = 'Ruesin', $expiry = 0)
{
 $ckey_length = 4;
 
 $key = md5($key);
 $keya = md5(substr($key, 0, 16));
 $keyb = md5(substr($key, 16, 16));
 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, 
   $ckey_length) : substr(md5(microtime()), - $ckey_length)) : '';
 
 $cryptkey = $keya . md5($keya . $keyc);
 $key_length = strlen($cryptkey);
 
 $string = $operation == 'DECODE' ? 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 == 'DECODE') {
  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));
 }
}
/*********************************************************************
函数名称:encrypt
函数作用:加密解密字符串
使用方法:
加密  :encrypt('str','E','nowamagic');
解密  :encrypt('被加密过的字符串','D','nowamagic');
参数说明:
$string :需要加密解密的字符串
$operation:判断是加密还是解密:E:加密 D:解密
$key  :加密的钥匙(密匙);
*********************************************************************/
function encrypt($string,$operation,$key='')
{
 $key=md5($key);
 $key_length=strlen($key);
 $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string;
 $string_length=strlen($string);
 $rndkey=$box=array();
 $result='';
 for($i=0;$i<=255;$i++)
 {
  $rndkey[$i]=ord($key[$i%$key_length]);
  $box[$i]=$i;
 }
 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=='D')
 {
  if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8))
  {
   return substr($result,8);
  }
  else
  {
   return'';
  }
 }
 else
 {
  return str_replace('=','',base64_encode($result));
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
PHP parse_url 一个好用的函数
Oct 03 PHP
php图片处理:加水印、缩略图的实现(自定义函数:watermark、thumbnail)
Dec 02 PHP
fetchAll()与mysql_fetch_array()的区别详解
Jun 05 PHP
php网站判断用户是否是手机访问的方法
Nov 01 PHP
php获取mysql字段名称和其它信息的例子
Apr 14 PHP
PHP独立Session数据库存储操作类分享
Jun 11 PHP
浅谈thinkphp的实例化模型
Jan 04 PHP
PHP输入输出流学习笔记
May 12 PHP
PHP的伪随机数与真随机数详解
May 27 PHP
php的api数据接口书写实例(推荐)
Sep 22 PHP
php判断是否为ajax请求的方法
Nov 29 PHP
PHP中quotemeta()函数的用法讲解
Apr 04 PHP
PHP下的浮点运算不准的解决方法
Oct 27 #PHP
php函数mkdir实现递归创建层级目录
Oct 27 #PHP
PHP实现递归目录的5种方法
Oct 27 #PHP
PHP读取大文件的几种方法介绍
Oct 27 #PHP
php array_multisort 对数组进行排序详解及实例代码
Oct 27 #PHP
PHP中的密码加密的解决方案总结
Oct 26 #PHP
php 解析xml 的四种方法详细介绍
Oct 26 #PHP
You might like
用Php实现链结人气统计
2006/10/09 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
php正则匹配html中带class的div并选取其中内容的方法
2015/01/13 PHP
Codeigniter的一些优秀特性总结
2015/01/21 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
JavaScript For Beginners(转载)
2007/01/05 Javascript
总结AJAX相关JS代码片段和浏览器模型
2007/08/15 Javascript
jQuery中innerHeight()方法用法实例
2015/01/19 Javascript
js实现带按钮的上下滚动效果
2015/05/12 Javascript
JS+CSS实现的竖向简洁折叠菜单效果代码
2015/10/22 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
JavaScript 控制字体大小设置的方法
2016/11/23 Javascript
JavaScript自定义函数实现查找两个字符串最长公共子串的方法
2016/11/24 Javascript
JavaScript中一些特殊的字符运算
2017/08/17 Javascript
Angular自定义组件实现数据双向数据绑定的实例
2017/12/11 Javascript
vue 组件中slot插口的具体用法
2018/04/03 Javascript
js合并两个数组生成合并后的key:value数组
2018/05/09 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
vue-cli点击实现全屏功能
2020/03/07 Javascript
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
python使用turtle库绘制树
2018/06/25 Python
使用Python实现将list中的每一项的首字母大写
2019/06/11 Python
Python模拟登录之滑块验证码的破解(实例代码)
2019/11/18 Python
Django框架反向解析操作详解
2019/11/28 Python
实验教师岗位职责
2014/02/13 职场文书
大学生应聘导游自荐信
2014/06/02 职场文书
大一新生期末自我评价
2014/09/12 职场文书
营销总监岗位职责
2014/09/16 职场文书
学生无故旷课检讨书
2014/09/20 职场文书
党的群众路线教育实践活动个人整改措施落实情况
2014/11/04 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
优秀共产党员推荐材料
2014/12/18 职场文书
投诉书范文
2015/07/02 职场文书
高中信息技术教学反思
2016/02/16 职场文书
《辉夜大小姐想让我告白》第三季正式预告
2022/03/20 日漫