最近在对接客户的CRM系统,获取令牌时,要用DES方式加密解密,由于之前没有搞错这种加密方式,经过请教了“百度”和“谷歌”两个老师后,结合了多篇文档内容后,终于实现了。

一、DES介绍

DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。

  • 跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。
  • 常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。
  • 加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

加密用到的方法:


openssl_encrypt($data, $method, $password, $options, $iv)

参数说明:

  1. $data 加密明文
  2. $method 加密方法

    • DES-ECB
    • DES-CBC
    • DES-CTR
    • DES-OFB
    • DES-CFB
  3. $passwd 加密密钥[密码]
  4. $options 数据格式选项(可选)【选项有:】

    • 0
    • OPENSSL_RAW_DATA=1
    • OPENSSL_ZERO_PADDING=2
    • OPENSSL_NO_PADDING=3
  5. $iv 密初始化向量(可选)
  • 需要注意:如果$method为DES-ECB,则$iv无需填写

二、解密用到的方法:


openssl_decrypt($data, $method, $password, $options, $iv)

参数说明:

  1. $data 要解密的数据
  2. 其他参数同加密方法

三、用法案例:

参数:


$data = '1234567887654321';//加密明文
$method = 'DES-ECB';//加密方法
$passwd = '12344321';//加密密钥
$options = 0;//数据格式选项(可选)
$iv = '';//加密初始化向量(可选)

(1) 默认填充方式:

    • 加密:


      $result = openssl_encrypt($data, $method, $passwd, $options);
      var_dump($result);

      结果:


      string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"
    • 解密


      $result = 'kQYOdswcm9I5elv2wdJucplqAgqDNqXg';
      var_dump(openssl_decrypt($result, $method, $passwd, 0));

      结果:


      string(16) "1234567887654321"

    (2) OPENSSL_RAW_DATA方式【会用PKCS#7进行补位】

    • 加密


      $result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
      var_dump($result);

      结果:


      string(24) "�v���9z[���nr�j �6��"

      我们可以看到结果是乱码的,这时我们需要base64一下


      $result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
      var_dump(base64_encode($result));

      这时结果是


      string(32) "kQYOdswcm9I5elv2wdJucplqAgqDNqXg"
    • 解密


      result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA); var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_RAW_DATA));

      结果:


      string(16) "1234567887654321"

      我们可以看到:默认填充方式与OPENSSL_RAW_DATA,这两种方式加密结果是一样的

    (3) OPENSSL_ZERO_PADDING方式

    看字面意思,是用0填充,但是测试并不起作用

    • 加密


      $result = openssl_encrypt($data, $method, $passwd, OPENSSL_ZERO_PADDING);
      var_dump($result);

      结果:


      string(24) "kQYOdswcm9I5elv2wdJucg=="
    • 解密:


      $result = openssl_encrypt($data, $method, $passwd, OPENSSL_ZERO_PADDING);
      var_dump(openssl_decrypt($result, $method, $passwd,OPENSSL_ZERO_PADDING));

      结果:


      string(16) "1234567887654321"

    (4) OPENSSL_NO_PADDING【不填充,需要手动填充】

    • 在openssl_encrypt前加上填充过程
    • 加密


      $str_padded = $data;
      if (strlen($str_padded) % 16) {
      $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
      }
      $result = openssl_encrypt($str_padded, $method, $passwd, OPENSSL_NO_PADDING);
      var_dump($result);
      echo '<br>';
      var_dump( base64_encode($result));

      结果:


      string(16) "�v���9z[���nr"
      string(24) "kQYOdswcm9I5elv2wdJucg=="

      我们可以看到结果是加密的乱码,需要用base64一下,就可以看到结果了

    • 解密:


      //加密begin
      $str_padded = $data;
      if (strlen($str_padded) % 16) {
      $str_padded = str_pad($str_padded,strlen($str_padded) + 16 - strlen($str_padded) % 16, "\0");
      }
      $result = openssl_encrypt($str_padded, $method, $passwd, OPENSSL_NO_PADDING);
      //加密end
      //解密begin
      $str = base64_encode($result);
      $m = openssl_decrypt( base64_decode($str) , $method, $passwd, OPENSSL_NO_PADDING);
      var_dump( rtrim( rtrim( $m,chr(0) ), chr(7) ) );
      //解密 end

      结果:


      string(16) "1234567887654321"

    ** 结尾要去除填充字符’0’和’a’。
    ‘a’是为了兼容用OPENSSL_RAW_DATA加密的结果。 **

    参照的文档有:

    相关知识文章

    原文地址:https://segmentfault.com/a/1190000016803710

    laravel中soapServer支持wsdl的例子的更多相关文章

    1. 配置WCF同时支持WSDL和REST,swaggerwcf生成文档

      配置WCF同时支持WSDL和REST,SwaggerWCF生成文档 VS创建一个WCF工程,通过NuGet添加SwaggerWcf 创建完成后通过 程序包管理控制台 pm>Install-Pac ...

    2. laravel中实现短信发送验证码

      前段时间想实现一个短信验证码的功能,但是卡了很长时间. 首先我用的是阿里云的短信服务业务,其首次接入流程如下: 在阿里云上开通短信服务后需要做的: 1,申请签名  2,申请模板   3,创建Acces ...

    3. Laravel中Redis的使用

      安装 laravel中使用redis首先需要你通过 Composer 安装 predis/predis 包: composer require predis/predis 配置 redis的配置文件是 ...

    4. 如何 Laravel 中验证 zip 压缩包里的文件?

      在 Laravel 程序中上传文件时,请求验证可以很好验证上传的文件.你可以要求上传文件必须为 图片 , 也可以限制文件字节 大小 , 也可以根据 mime types 或者 文件扩展名 过滤文件. ...

    5. Laravel中的日志与上传

      PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...

    6. ORACLE中的支持正则表达式的函数

      ORACLE中的支持正则表达式的函数主要有下面四个:1,REGEXP_LIKE :与LIKE的功能相似2,REGEXP_INSTR :与INSTR的功能相似3,REGEXP_SUBSTR :与SUBS ...

    7. 我教女朋友学编程html系列(5) html中table的用法和例子

      女朋友不是学计算机的,但是现在从事计算机行业,做技术支持,她想学习编程,因此我打算每天教她一点点,日积月累,带她学习编程,如果其他初学者感兴趣,可以跟着学. 为了将table介绍的简单.生动,具有实战 ...

    8. cron以及在laravel中使用cron

      yum install vixie-cron yum install crontabs /bin/systemctl restart crond.service #启动服务 /bin/systemct ...

    9. Laravel 中使用 Redis 数据库

      一.前言 Redis 是一个开源高效的键值对存储系统,它通常用作为一个数据结构服务器来存储键值对,它可以支持字符串.散列.列表.集合.有序集合. 1. 安装 predis/predis 在 Larav ...

    随机推荐

    1. 设备综合效率OEE

      设备综合效率OEE OEE(OverallEquipmentEffectiveness),即设备综合效率,也有资料表述为总体设备效率,其本质就是设备负荷时间内实际产量与理论产量的比值. TEEP(To ...

    2. BootStrap学习(一)——BootStrap入门

      1.环境搭建 中文官网下载地址:http://www.bootcss.com/ 右击选中的WEB项目,点击导入,选择文件系统,然后下一步,选择BootStrap文件目录路径,如下: 完成后,WEB项目 ...

    3. C#压缩和解压缩字节(GZip)

      标题:C#压缩和解压缩字节(GZip的使用) 作用:此类在 .NET Framework 2.0 版中是新增的.提供用于压缩和解压缩流的方法和属性.定义:表示 GZip 数据格式,它使用无损压缩和解压 ...

    4. STM8S103之ADC

      如何快速了解ADC,查看Reference manual中ADC registers章节,初步了解到ADC ADC buffer register和ADC data register Analog W ...

    5. 初识Git(一)

      以前经常听到Git,作为一个菜鸟级自学选手从没有真正去了解Git,借刘铁猛老师在油管上的<对答如刘>初步认识了git,作以下记录. 1.初始化一个git管理的文件夹 首先我在我的电脑C盘P ...

    6. nginx的rewrite规则

      301跳转: server { listen 80; server_name www.xiaofan.com; return 301 https://$server_name$request_uri; ...

    7. Acme Corporation UVA - 11613 费用流

      Code: #include<cstdio> #include<cstring> #include<vector> #include<queue> #i ...

    8. (四)React高级内容

      1. React developertools安装及使用 2. PropTypes与DefaultProps 讲一下PropTypes, 先拿TodoItem来说: 从几种类型中选: 3 props ...

    9. mysql日期加减运算

      MySQL 日期类型MySQL 日期类型:日期格式.所占存储空间.日期范围 比较. 日期类型        存储空间       日期格式                 日期范围 --------- ...

    10. 一片非常有趣的文章 三分钟读懂TT猫分布式、微服务和集群之路

      原文http://www.cnblogs.com/smallSevens/p/7501932.html#3782600 三分钟读懂TT猫分布式.微服务和集群之路   针对新手入门的普及,有过大型网站技 ...