php DES加密算法实例分析


Posted in PHP onSeptember 18, 2019

本文实例讲述了php DES加密算法。分享给大家供大家参考,具体如下:

yii框架的DES代码

<?php
/**
 *@see Yii CSecurityManager;
 */
class Des{
 public static function encrypt($data,$key){
   $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
   $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
   srand();
   $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);
   mcrypt_generic_init($module,$key,$iv);
   $encrypted=$iv.mcrypt_generic($module,$data);
   mcrypt_generic_deinit($module);
   mcrypt_module_close($module);
   return md5($data).'_'.base64_encode($encrypted);
 }
 public static function decrypt($data,$key){  
   $_data = explode('_',$data,2);
   if(count($_data)<2){
    return false;
   }
   $data = base64_decode($_data[1]);   
   $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');
   $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));
   $ivSize=mcrypt_enc_get_iv_size($module);
   $iv=substr($data,0,$ivSize);
   mcrypt_generic_init($module,$key,$iv);
   $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));
   mcrypt_generic_deinit($module);
   mcrypt_module_close($module);
   $decrypted = rtrim($decrypted,"\0");    
   if($_data[0]!=md5($decrypted)){
    return false;
   }
   return $decrypted;
 }
}

在网上看到了一篇文章,讲到:

由于PHP使用mcrypt扩展进行3DES加密,填充模式是跟JAVA以及.NET是不一样的,JAVA和.NET填充模式使用的是PKCS7。

所以PHP端必须自定义一个函数对加密字符串进行PKCS7模式补位填充。

另外一点就是双方的KEY注意进行base64编码,最后PHP端经过3DES加密后得到的结果也需要进行base64编码。

以上几点都做好之后,加密结果就一致了。

下面是兼容C#和java的3DES加密的算法

<?php
class STD3Des
{
  private $key = "";
  private $iv = "";
  /**
  * 构造,传递二个已经进行base64_encode的KEY与IV
  *
  * @param string $key
  * @param string $iv
  */
  function __construct ($key, $iv)
  {
    if (empty($key) || empty($iv)) {
      echo 'key and iv is not valid';
      exit();
    }
    $this->key = $key;
    $this->iv = $iv;
  }
  /**
  *加密
  * @param <type> $value
  * @return <type>
  */
  public function encrypt ($value)
  {
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    $iv = base64_decode($this->iv);
    $value = $this->PaddingPKCS7($value);
    $key = base64_decode($this->key);
    mcrypt_generic_init($td, $key, $iv);
    $ret = base64_encode(mcrypt_generic($td, $value));
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $ret;
  }
  /**
  *解密
  * @param <type> $value
  * @return <type>
  */
  public function decrypt ($value)
  {
    $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
    $iv = base64_decode($this->iv);
    $key = base64_decode($this->key);
    mcrypt_generic_init($td, $key, $iv);
    $ret = trim(mdecrypt_generic($td, base64_decode($value)));
    $ret = $this->UnPaddingPKCS7($ret);
    mcrypt_generic_deinit($td);
    mcrypt_module_close($td);
    return $ret;
  }
  private function PaddingPKCS7 ($data)
  {
    $block_size = mcrypt_get_block_size('tripledes', 'cbc');
    $padding_char = $block_size - (strlen($data) % $block_size);
    $data .= str_repeat(chr($padding_char), $padding_char);
    return $data;
  }
  private function UnPaddingPKCS7($text)
  {
    $pad = ord($text{strlen($text) - 1});
    if ($pad > strlen($text)) {
      return false;
    }
    if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
      return false;
    }
    return substr($text, 0, - 1 * $pad);
  }
}
?>
PHP 相关文章推荐
PHP 命令行参数详解及应用
May 18 PHP
探讨PHP中OO之静态关键字以及类常量的详解
Jun 07 PHP
php中将数组转成字符串并保存到数据库中的函数代码
Sep 29 PHP
yii框架表单模型使用及以数组形式提交表单数据示例
Apr 30 PHP
PHP生成数组再传给js的方法
Aug 07 PHP
smarty自定义函数htmlcheckboxes用法实例
Jan 22 PHP
用PHP代码给图片加水印
Jul 01 PHP
Zend Framework教程之Application和Bootstrap用法详解
Mar 10 PHP
yii2实现分页,带搜索的分页功能示例
Jan 07 PHP
Thinkphp开发--集成极光推送
Sep 15 PHP
PHP学习记录之数组函数
Jun 01 PHP
PDO::errorInfo讲解
Jan 28 PHP
php实现QQ小程序发送模板消息功能
Sep 18 #PHP
php文件后缀不强制为.php的实操方法
Sep 18 #PHP
php校验公钥是否可用的实例方法
Sep 17 #PHP
php写入mysql中文乱码的实例解决方法
Sep 17 #PHP
php写入txt乱码的解决方法
Sep 17 #PHP
解决php写入数据库乱码的问题
Sep 17 #PHP
php写入文件不覆盖的实例讲解
Sep 17 #PHP
You might like
法压式咖啡之制作法
2021/03/03 冲泡冲煮
浅析memcache启动以及telnet命令详解
2013/06/28 PHP
模板引擎smarty工作原理以及使用示例
2014/05/25 PHP
PHP之预定义接口详解
2015/07/29 PHP
PHP学习笔记之session
2018/05/06 PHP
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
range 标准化之获取
2011/08/28 Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
2013/03/19 Javascript
JavaScript自执行闭包的小例子
2013/06/29 Javascript
jQuery实现单击按钮遮罩弹出对话框(仿天猫的删除对话框)
2014/04/10 Javascript
jQuery UI插件自定义confirm确认框的方法
2015/03/20 Javascript
jQuery插件简单学习实例教程
2016/07/01 Javascript
Javascript调试之console对象——你不知道的一些小技巧
2017/07/10 Javascript
JS获取数组中出现次数最多及第二多元素的方法
2017/10/27 Javascript
angular2路由之routerLinkActive指令【推荐】
2018/05/30 Javascript
详解小程序毫秒级倒计时(适用于拼团秒杀功能)
2019/05/05 Javascript
layui时间控件选择时间范围的实现方法
2019/09/28 Javascript
javascript实现蒙版与禁止页面滚动
2020/01/11 Javascript
Js跳出两级循环方法代码实例
2020/09/22 Javascript
简单介绍使用Python解析并修改XML文档的方法
2015/10/15 Python
基于django ManyToMany 使用的注意事项详解
2019/08/09 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
Python3 搭建Qt5 环境的方法示例
2020/07/16 Python
python 解决Windows平台上路径有空格的问题
2020/11/10 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
Python创建自己的加密货币的示例
2021/03/01 Python
函授自我鉴定
2013/11/06 职场文书
一名毕业生的自我鉴定
2013/12/04 职场文书
大学生党课思想汇报
2013/12/29 职场文书
农村婚礼主持词
2014/03/13 职场文书
2014年入党积极分子党课学习心得体会模板
2014/04/03 职场文书
人力资源管理专业自荐信
2014/06/24 职场文书
答谢词范文
2015/01/05 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
2015年见习期个人工作总结
2015/05/28 职场文书
寻找成龙观后感
2015/06/12 职场文书