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新手上路(八)
Oct 09 PHP
PHP中文URL编解码(urlencode()rawurlencode()
Jul 03 PHP
基于PHP文件操作的详解
Jun 05 PHP
在windows平台上构建自己的PHP实现方法(仅适用于php5.2)
Jul 05 PHP
php批量更改数据库表前缀实现方法
Oct 26 PHP
PHP中比较两个字符串找出第一个不同字符位置例子
Apr 08 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
Jun 17 PHP
php跨站攻击实例分析
Oct 28 PHP
ThinkPHP自动完成中使用函数与回调方法实例
Nov 29 PHP
配置Nginx+PHP的正确思路与过程
May 10 PHP
CI框架源码解读之利用Hook.php文件完成功能扩展的方法
May 18 PHP
php实现的后台表格分页功能示例
Oct 23 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
php实现的数字验证码及数字运算验证码
2015/07/30 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
ThinkPHP框架实现FTP图片上传功能示例
2019/04/08 PHP
在phpstudy集成环境下的nginx服务器下配置url重写
2019/12/02 PHP
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
详细解读JavaScript的跨浏览器事件处理
2015/08/12 Javascript
jQuery zTree加载树形菜单功能
2016/02/25 Javascript
移动端jQuery修正Web页面滑动时div问题的两则实例
2016/05/30 Javascript
JS实现可编辑的后台管理菜单功能【附demo源码下载】
2016/09/13 Javascript
Bootstrap CSS组件之按钮下拉菜单
2016/12/17 Javascript
Json按某个键的值进行排序
2016/12/22 Javascript
js实现悬浮窗效果(支持拖动)
2017/03/09 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
Angularjs cookie 操作实例详解
2017/09/27 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
JavaScript捕捉事件和阻止冒泡事件实例分析
2018/08/03 Javascript
[00:33]2016完美“圣”典风云人物:BurNIng宣传片
2016/12/10 DOTA
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python获得图片base64编码示例
2014/01/16 Python
python topN 取最大的N个数或最小的N个数方法
2018/06/04 Python
python集合的创建、添加及删除操作示例
2019/10/08 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
利用HTML5 Canvas API绘制矩形的超级攻略
2016/03/21 HTML / CSS
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
英国最大的在线运动补充剂商店:Discount Supplements
2017/06/03 全球购物
Aquatalia官网:意大利著名鞋履品牌
2019/09/26 全球购物
JBL加拿大官方商店:扬声器、耳机等
2020/10/23 全球购物
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
进步之星获奖感言
2014/02/22 职场文书
弘扬民族精神演讲稿
2014/05/07 职场文书
入党宣誓仪式主持词
2015/06/29 职场文书
卫生主题班会
2015/08/14 职场文书
Python中Permission denied的解决方案
2021/04/02 Python