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新手谈谈我的学习心得
Feb 25 PHP
php ignore_user_abort与register_shutdown_function 使用方法
Jun 14 PHP
php安全之直接用$获取值而不$_GET 字符转义
Jun 03 PHP
解析PHP中ob_start()函数的用法
Jun 24 PHP
PHP循环函数使用介绍之PHP基础入门教程
Sep 21 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
Oct 25 PHP
PHPMailer发送HTML内容、带附件的邮件实例
Jul 01 PHP
Laravel 5框架学习之用户认证
Apr 09 PHP
PHP与Ajax相结合实现登录验证小Demo
Mar 16 PHP
Yii2搭建后台并实现rbac权限控制完整实例教程
Apr 28 PHP
PHP大文件分块上传功能实例详解
Jul 22 PHP
php文件后缀不强制为.php的实操方法
Sep 18 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聊天室技术
2006/10/09 PHP
php中的比较运算符详解
2013/10/28 PHP
php7安装mongoDB扩展的方法分析
2017/08/02 PHP
通过PHP的Wrapper无缝迁移原有项目到新服务的实现方法
2020/04/02 PHP
SyntaxHighlighter语法高亮插件使用说明
2011/08/14 Javascript
Uglifyjs(JS代码优化工具)入门 安装使用
2020/04/13 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
jquery重新播放css动画所遇问题解决
2013/08/21 Javascript
jquery+css实现动感的图片切换效果
2015/11/25 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
详解jQuery选择器
2016/12/21 Javascript
AngularJs上传前预览图片的实例代码
2017/01/20 Javascript
使用vue-resource进行数据交互的实例
2017/09/02 Javascript
vue-vuex中使用commit提交mutation来修改state的方法详解
2018/09/16 Javascript
在vue项目中优雅的使用SVG的方法实例详解
2018/12/03 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
vue+elementui实现点击table中的单元格触发事件--弹框
2020/07/18 Javascript
electron踩坑之remote of undefined的解决
2020/10/06 Javascript
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
python opencv 读取图片 返回图片某像素点的b,g,r值的实现方法
2019/07/03 Python
500行代码使用python写个微信小游戏飞机大战游戏
2019/10/16 Python
Python实现投影法分割图像示例(二)
2020/01/17 Python
Python drop方法删除列之inplace参数实例
2020/06/27 Python
运行Python编写的程序方法实例
2020/10/21 Python
CSS3 @media的基本用法总结
2019/09/10 HTML / CSS
CSS3实现文字描边的2种方法(小结)
2020/02/14 HTML / CSS
HTML5 3D书本翻页动画的实现示例
2019/08/28 HTML / CSS
台湾森森购物网:U-mall
2017/10/16 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
预备党员入党自我评价范文
2014/03/10 职场文书
护理人员的自我评价分享
2014/03/15 职场文书
医德医风自我评价
2014/09/19 职场文书
前台文员岗位职责
2015/02/04 职场文书
房地产销售员岗位职责
2015/04/11 职场文书
JS实现简单九宫格抽奖
2022/06/28 Javascript