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 相关文章推荐
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
Feb 11 PHP
深入解析php之apc
May 15 PHP
php操作MongoDB基础教程(连接、新增、修改、删除、查询)
Mar 25 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
ThinkPHP采用原生query实现关联查询left join实例
Dec 02 PHP
php+mysqli实现将数据库中一张表信息打印到表格里的方法
Jan 28 PHP
yii2简单使用less代替css示例
Mar 10 PHP
PHP堆栈调试操作简单示例
Jun 15 PHP
PHPUnit测试私有属性和方法功能示例
Jun 12 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
php连接mysql数据库最简单的实现方法
Sep 24 PHP
Yii 框架使用数据库(databases)的方法示例
May 19 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往windows中添加用户
2006/12/06 PHP
PHP array操作10个小技巧分享
2011/06/23 PHP
PHP二维数组去重实例分析
2016/11/18 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
JavaScript中清空数组的三种方法分享
2011/04/07 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
JS日期和时间选择控件升级版(自写)
2013/08/02 Javascript
js控制不同的时间段显示不同的css样式的实例代码
2013/11/04 Javascript
鼠标滑在标题上显示图片的JS代码
2013/11/19 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
对JavaScript的全文搜索实现相关度评分的功能的方法
2015/06/24 Javascript
深入浅析JavaScript字符串操作方法 slice、substr、substring及其IE兼容性
2015/12/16 Javascript
JS控制层作圆周运动的方法
2016/06/20 Javascript
webpack打包js的方法
2018/03/12 Javascript
jQuery pjax 应用简单示例
2018/09/20 jQuery
解决小程序无法触发SESSION问题
2020/02/03 Javascript
基于NodeJS开发钉钉回调接口实现AES-CBC加解密
2020/08/20 NodeJs
[03:16]DOTA2完美大师赛小组赛精彩集锦
2017/11/22 DOTA
[55:35]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第二场 1月22日
2021/03/11 DOTA
python中global用法实例分析
2015/04/30 Python
python爬虫使用cookie登录详解
2017/12/27 Python
python版飞机大战代码分享
2018/11/20 Python
利用python修改json文件的value方法
2018/12/31 Python
详解用python计算阶乘的几种方法
2019/08/14 Python
使用python的pyplot绘制函数实例
2020/02/13 Python
信号生成及DFT的python实现方式
2020/02/25 Python
python urllib和urllib3知识点总结
2021/02/08 Python
欧洲领先的火车票和大巴票预订平台:Trainline
2018/12/26 全球购物
Viking比利时:购买办公用品
2019/10/30 全球购物
经济管理自荐书
2014/06/09 职场文书
助学贷款贫困证明
2014/09/23 职场文书
党员教师自我剖析材料
2014/09/29 职场文书
上班迟到检讨书
2015/05/06 职场文书
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技