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 远程关机实现代码
Nov 10 PHP
支持数组的ADDSLASHES的php函数
Feb 16 PHP
PHP 开发环境配置(Zend Studio)
Apr 28 PHP
php 广告调用类代码(支持Flash调用)
Aug 11 PHP
PHP三元运算符的结合性介绍
Jan 10 PHP
php mssql扩展SQL查询中文字段名解决方法
Oct 15 PHP
php中计算程序运行时间的类代码
Nov 03 PHP
PHP实现搜索相似图片
Sep 22 PHP
PHP封装的多文件上传类实例与用法详解
Feb 07 PHP
thinkphp自定义权限管理之名称判断方法
Apr 01 PHP
laravel框架创建授权策略实例分析
Nov 22 PHP
thinkphp 获取控制器及控制器方法
Apr 16 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
Php output buffering缓存及程序缓存深入解析
2013/07/15 PHP
对PHP新手的一些建议(PHP学习经验总结)
2014/08/20 PHP
smarty内置函数capture用法分析
2015/01/22 PHP
用jquery来定位
2007/02/20 Javascript
Juqery Html(),append()等方法的Bug解决方法
2010/12/13 Javascript
原生JS实现表单checkbook获取已选择的值
2013/07/21 Javascript
AngularGauge 属性解析详解
2016/09/06 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
vue-router路由参数刷新消失的问题解决方法
2017/06/17 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
JavaScript封闭函数及常用内置对象示例
2019/05/13 Javascript
详解vue中使用axios对同一个接口连续请求导致返回数据混乱的问题
2019/11/06 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
详解JavaScript之ES5的继承
2020/07/08 Javascript
Js数组扁平化实现方法代码总汇
2020/11/11 Javascript
JavaScript实现网页tab栏效果制作
2020/11/20 Javascript
使用Python脚本来控制Windows Azure的简单教程
2015/04/16 Python
深入了解Django中间件及其方法
2019/07/26 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
python函数修饰符@的使用方法解析
2019/09/02 Python
Python使用Excel将数据写入多个sheet
2020/05/16 Python
pycharm最新激活码有效期至2100年(亲测可用)
2021/02/05 Python
计算机专业毕业生自荐信
2013/12/31 职场文书
学生穿着不得体检讨书
2014/10/12 职场文书
高中生期中考试失利检讨书
2014/10/23 职场文书
2015年纪检监察工作总结
2015/04/08 职场文书
2015年污水处理厂工作总结
2015/05/26 职场文书
小学生暑假安全保证书
2015/07/13 职场文书
大学生创业,为什么都会选择快餐饮?
2019/08/08 职场文书
浅谈JavaScript作用域
2021/12/06 Javascript
彩虹社八名人气艺人全新周边限时推出,性转女装男装一次拥有!
2022/04/01 日漫
解决IDEA翻译插件Translation报错更新TTK失败不能使用
2022/04/24 Python
JS轻量级函数式编程实现XDM二
2022/06/16 Javascript
Android移动应用开发指南之六种布局详解
2022/09/23 Java/Android