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 相关文章推荐
用文本文件制作留言板提示(上)
Oct 09 PHP
从Web查询数据库之PHP与MySQL篇
Sep 25 PHP
PHP中使用unset销毁变量并内存释放问题
Jul 05 PHP
深入解析php中的foreach函数
Aug 31 PHP
win7计划任务定时执行PHP脚本设置图解
May 09 PHP
PHP也能干大事之PHP中的编码解码详解
Apr 20 PHP
迪菲-赫尔曼密钥交换(Diffie?Hellman)算法原理和PHP实现版
May 12 PHP
PHP易混淆知识整理笔记
Sep 24 PHP
php foreach如何跳出两层循环(详解)
Nov 05 PHP
PHP中STDCLASS用法实例分析
Nov 11 PHP
laravel excel 上传文件保存到本地服务器功能
Nov 14 PHP
PHP实现单例模式建立数据库连接的方法分析
Feb 11 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
PHP防止刷新重复提交页面的示例代码
2015/11/11 PHP
实现WordPress主题侧边栏切换功能的PHP脚本详解
2015/12/14 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
基于Laravel实现的用户动态模块开发
2017/09/21 PHP
JQuery 表格操作(交替显示、拖动表格行、选择行等)
2009/07/29 Javascript
修复ie8&amp;chrome下window的resize事件多次执行
2011/10/20 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
jQuery插件jRumble实现网页元素抖动
2015/06/05 Javascript
JavaScript判断数组是否包含指定元素的方法
2015/07/01 Javascript
谈一谈jQuery核心架构设计
2016/03/28 Javascript
vue2.0开发实践总结之疑难篇
2016/12/07 Javascript
简单实现Bootstrap标签页
2020/08/09 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
带你快速理解javascript中的事件模型
2017/08/14 Javascript
JsChart组件使用详解
2018/03/04 Javascript
Vue与Node.js通过socket.io通信的示例代码
2018/07/25 Javascript
vue项目搭建以及全家桶的使用详细教程(小结)
2018/12/19 Javascript
Python 变量类型及命名规则介绍
2013/06/08 Python
Python 不同对象比较大小示例探讨
2014/08/21 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
2014/11/28 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
谈一谈基于python的面向对象编程基础
2019/05/21 Python
Python编程中类与类的关系详解
2019/08/08 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
python中复数的共轭复数知识点总结
2020/12/06 Python
纯css3显示隐藏一个div特效的具体实现
2014/02/10 HTML / CSS
纽约的奢华内衣店:Journelle
2016/07/29 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
应届大学生自荐书
2014/06/17 职场文书
银行员工犯错检讨书
2014/09/16 职场文书
乡镇群众路线整改落实情况汇报
2014/10/28 职场文书
银行柜员工作心得体会
2016/01/23 职场文书
2019经典广告词集锦!
2019/07/02 职场文书
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js