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 相关文章推荐
js下函数般调用正则的方法附代码
Jun 22 PHP
php 文件状态缓存带来的问题
Dec 14 PHP
php self,$this,const,static,-&amp;gt;的使用
Oct 22 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
May 29 PHP
PHP 年龄计算函数(精确到天)
Jun 07 PHP
使用PHP下载CSS文件中的图片的代码
Sep 24 PHP
php 获取文件行数的方法总结
Oct 11 PHP
thinkphp5.0自定义验证规则使用方法
Nov 16 PHP
php 广告点击统计代码(php+mysql)
Feb 21 PHP
关于php unset对json_encode的影响详解
Nov 14 PHP
PHP使用openssl扩展实现加解密方法示例
Feb 20 PHP
基于ThinkPHP删除目录及目录文件函数
Oct 28 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基础知识:类与对象(5) static
2006/12/13 PHP
PHP6 先修班 JSON实例代码
2008/08/23 PHP
php实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
PHP调用C#开发的dll类库方法
2014/07/28 PHP
PHP CodeIgniter框架的工作原理研究
2015/03/30 PHP
JavaScript中最简洁的编码html字符串的方法
2014/10/11 Javascript
鼠标经过子元素触发mouseout,mouseover事件的解决方案
2015/07/26 Javascript
JS模拟Dialog弹出浮动框效果代码
2015/10/16 Javascript
jQuery formValidator表单验证
2016/01/07 Javascript
原生JS实现的放大镜效果实例代码
2016/10/15 Javascript
js闭包用法实例详解
2016/12/13 Javascript
JavaScript中数组Array.sort()排序方法详解
2017/03/01 Javascript
使用 jQuery 实现表单验证功能
2017/07/05 jQuery
如何去除vue项目中的#及其ie9兼容性
2018/01/11 Javascript
移动端滑动切换组件封装 vue-swiper-router实例详解
2018/11/25 Javascript
VueJS 取得 URL 参数值的方法
2019/07/19 Javascript
微信小程序点击item使之滚动到屏幕中间位置
2020/03/25 Javascript
TypeScript 运行时类型检查补充工具
2020/09/28 Javascript
python提示No module named images的解决方法
2014/09/29 Python
Python制作CSDN免积分下载器
2015/03/10 Python
基于Django filter中用contains和icontains的区别(详解)
2017/12/12 Python
python 执行shell命令并将结果保存的实例
2018/05/11 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
django富文本编辑器的实现示例
2019/04/10 Python
numpy ndarray 取出满足特定条件的某些行实例
2019/12/05 Python
Python中six模块基础用法
2019/12/08 Python
tensorflow 固定部分参数训练,只训练部分参数的实例
2020/01/20 Python
python 实现任务管理清单案例
2020/04/25 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
主题团日活动总结
2014/06/25 职场文书
2014法院干警廉洁警示教育思想汇报
2014/09/13 职场文书
农村党员对照检查材料
2014/09/24 职场文书
详解MySQL中的pid与socket
2021/06/15 MySQL
基于Python编写简易版的天天跑酷游戏的示例代码
2022/03/23 Python
Elasticsearch 配置详解
2022/04/19 Java/Android