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 smarty的预保留变量总结
Dec 04 PHP
PHP setcookie() cannot modify header information 的解决方法
Jan 09 PHP
php遍历目录与文件夹的多种方法详解
Nov 14 PHP
Yii调试SQL的常用方法
Jul 09 PHP
php自动给网址加上链接的方法
Jun 02 PHP
学习php设计模式 php实现建造者模式
Dec 07 PHP
PHP+JQuery+Ajax实现分页方法详解
Aug 06 PHP
thinkPHP5.0框架引入Traits功能实例分析
Mar 18 PHP
PHP中使用CURL发送get/post请求上传图片批处理功能
Oct 15 PHP
safari下载文件自动加了html后缀问题
Nov 09 PHP
PHP函数积累总结
Mar 19 PHP
laravel通用化的CURD的实现
Dec 13 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
Chrome Web App开发小结
2014/09/04 PHP
php中字符集转换iconv函数使用总结
2014/10/11 PHP
PHP查询附近的人及其距离的实现方法
2016/05/11 PHP
PHP常见的序列化与反序列化操作实例分析
2019/10/28 PHP
JQuery的ajax基础上的超强GridView展示
2009/09/18 Javascript
javascript 内存回收机制理解
2011/01/17 Javascript
jquery 延迟执行实例介绍
2013/08/20 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
jQuery实现3D文字特效的方法
2015/03/10 Javascript
Javascript实现鼠标右键特色菜单
2015/08/04 Javascript
Javascript的无new构建实例详解
2016/05/15 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
jQuery实现动态加载(按需加载)javascript文件的方法分析
2019/05/31 jQuery
json_decode 索引为数字时自动排序问题解决方法
2020/03/28 Javascript
详解Vue之计算属性
2020/06/20 Javascript
python执行shell获取硬件参数写入mysql的方法
2014/12/29 Python
Python返回真假值(True or False)小技巧
2015/04/10 Python
python中zip()方法应用实例分析
2016/04/16 Python
python2.7的编码问题与解决方法
2016/10/04 Python
Python不同目录间进行模块调用的实现方法
2019/01/29 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
详解CSS3浏览器兼容
2016/12/14 HTML / CSS
北卡罗来纳州豪华家具和家居装饰店:Carolina Rustica
2018/10/30 全球购物
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
艺术系大学生毕业个人自我评价
2013/09/19 职场文书
汽车维修与检测专业应届生求职信
2013/11/12 职场文书
大一军训感言
2014/01/09 职场文书
社区个人对照检查材料(群众路线)
2014/09/26 职场文书
人事局接收函
2015/01/31 职场文书
2015年学校教科室工作总结
2015/07/20 职场文书
公务员爱岗敬业心得体会
2016/01/25 职场文书
十二月早安励志心语大全
2019/12/03 职场文书
励志语录:时光飞逝,请学会珍惜所有的人和事
2020/01/16 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis
详解nginx进程锁的实现
2021/06/14 Servers