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 imagecreatetruecolor 创建高清和透明图片代码小结
May 15 PHP
php FLEA中二叉树数组的遍历输出
Sep 26 PHP
PHP随机生成随机个数的字母组合示例
Jan 14 PHP
php阻止页面后退的方法分享
Feb 17 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
thinkPHP简单实现多个子查询语句的方法
Dec 05 PHP
yii2中dropDownList实现二级和三级联动写法
Apr 26 PHP
PHP编程实现csv文件导入mysql数据库的方法
Apr 29 PHP
php实现微信企业号支付个人的方法详解
Jul 26 PHP
php实现的生成排列算法示例
Jul 25 PHP
Yii框架安装简明教程
May 15 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 IPV6正则表达式验证代码
2010/02/16 PHP
php array_walk 对数组中的每个元素应用用户自定义函数详解
2016/11/18 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
jquery 批量上传图片实现代码
2010/01/28 Javascript
javascript常用方法、属性集合及NodeList 和 HTMLCollection 的浏览器差异
2010/12/25 Javascript
JavaScript中的apply()方法和call()方法使用介绍
2012/07/25 Javascript
判断是否存在子节点的实现代码
2016/05/18 Javascript
jQuery实现判断控件是否显示的方法
2017/01/11 Javascript
一篇看懂vuejs的状态管理神器 vuex状态管理模式
2017/04/20 Javascript
第一个Vue插件从封装到发布
2017/11/22 Javascript
angularJs在多个控制器中共享服务数据的方法
2018/09/30 Javascript
Layui数据表格 前后端json数据接收的方法
2019/09/19 Javascript
[58:23]LGD vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[49:30]DOTA2-DPC中国联赛正赛 Dragon vs Dynasty BO3 第二场 3月4日
2021/03/11 DOTA
用Python进行一些简单的自然语言处理的教程
2015/03/31 Python
Java多线程编程中ThreadLocal类的用法及深入
2016/06/21 Python
python中使用xlrd读excel使用xlwt写excel的实例代码
2018/01/31 Python
pandas string转dataframe的方法
2018/04/11 Python
ubuntu系统下使用pm2设置nodejs开机自启动的方法
2018/05/12 NodeJs
python爬取哈尔滨天气信息
2018/07/14 Python
Python使用分布式锁的代码演示示例
2018/07/30 Python
python OpenCV GrabCut使用实例解析
2019/11/11 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
2020/02/28 Python
Python grpc超时机制代码示例
2020/09/14 Python
天猫精选:上天猫,就够了
2016/09/21 全球购物
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
会计应聘求职信范文
2013/12/17 职场文书
车祸赔偿收入证明
2014/01/09 职场文书
教师党性分析材料
2014/02/04 职场文书
淘宝店铺营销方案
2014/02/13 职场文书
新法人代表任命书
2014/06/06 职场文书
手机被没收的检讨书
2014/10/04 职场文书
教师节标语大全
2014/10/07 职场文书
小学教育见习报告
2014/10/31 职场文书
Python3 使用pip安装git并获取Yahoo金融数据的操作
2021/04/08 Python
MySQL示例讲解数据库约束以及表的设计
2022/06/16 MySQL