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 已经成熟
Dec 04 PHP
PHP 页面跳转到另一个页面的多种方法方法总结
Jul 07 PHP
深入解析php中的foreach函数
Aug 31 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
Aug 08 PHP
PHP的switch判断语句的“高级”用法详解
Oct 01 PHP
php常用文件操作函数汇总
Nov 22 PHP
php使用标签替换的方式生成静态页面
May 21 PHP
php创建无限级树型菜单
Nov 05 PHP
WordPress中缩略图的使用以及相关技巧
Nov 24 PHP
Symfony的安装和配置方法
Mar 17 PHP
浅谈php(codeigniter)安全性注意事项
Apr 06 PHP
PHP+Ajax实现的无刷新分页功能详解【附demo源码下载】
Jul 03 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
一个程序下载的管理程序(二)
2006/10/09 PHP
PHP实现找出有序数组中绝对值最小的数算法分析
2017/08/07 PHP
redis+php实现微博(三)微博列表功能详解
2019/09/23 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
tp5.1 框架数据库常见操作详解【添加、删除、更新、查询】
2020/05/26 PHP
Javascript 获取LI里的内容
2008/12/17 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
原生js获取宽高与jquery获取宽高的方法关系对比
2014/04/04 Javascript
AngularJS初始化过程分析(引导程序)
2014/12/06 Javascript
jQuery中复合属性选择器用法实例
2014/12/31 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
js判断上传文件后缀名是否合法
2016/01/28 Javascript
ajax在兼容模式下失效的快速解决方法
2016/03/22 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
angularjs的单选框+ng-repeat的实现方法
2018/09/12 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
python爬取淘宝商品销量信息
2018/11/16 Python
python实现从pdf文件中提取文本,并自动翻译的方法
2018/11/28 Python
Python read函数按字节(字符)读取文件的实现
2019/07/03 Python
关于Python形参打包与解包小技巧分享
2019/08/24 Python
Python collections中的双向队列deque简单介绍详解
2019/11/04 Python
Python 实现取多维数组第n维的前几位
2019/11/26 Python
python简单利用字典破解zip文件口令
2020/09/07 Python
Python 实现二叉查找树的示例代码
2020/12/21 Python
CSS3中的display:grid,网格布局介绍
2019/10/30 HTML / CSS
20佳惊艳的HTML5应用程序示例分享
2011/05/03 HTML / CSS
欧洲品牌瓷器餐具网上商店:Porzellantreff.de
2018/04/04 全球购物
英国马匹装备和马术用品购物网站:Equine Superstore
2019/03/03 全球购物
英语专业学生的自我评价
2013/12/30 职场文书
我未来的职业规划范文
2014/01/11 职场文书
读书活动总结范文
2014/04/26 职场文书
假释思想汇报范文
2014/10/11 职场文书
Javascript 解构赋值详情
2021/11/17 Javascript
基于Python实现对比Exce的工具
2022/04/07 Python