最近在对接客户的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 密初始化向量(可选)

  • 需要注意:如果 m e t h o d 为 D E S − E C B , 则 method为DES-ECB,则 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加密的结果。 **

参照的文档有:

  • PHP 基础篇 - PHP 中 DES 加解密详解
    https://www.jianshu.com/p/546137b8ac7a

  • 关于mcrypt_encrypt和openssl_encrypt加密结果不一致的解决
    http://www.heylc.com/fuanyuopenssl.html

相关知识文章

  • RSA密码传输加密方案
    https://wenku.baidu.com/view/83cb1d6df011f18583d049649b6648d7c1c7089d.html?re=view
  • iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero)
    https://www.jianshu.com/p/7b6f5aaa7680
  • PHP由mcrypt扩展加密改为openssl扩展加密
    https://www.xxling.com/blog/article/3114.aspx
  • PHP用openssl_encrypt代替mcrypt_encrypt
    https://coderlife.cn/1624.html
  • AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
    https://my.oschina.net/Jacker/blog/86383
  • 在PHP7.1中使用openssl取代mcrypt
    https://swoole.app/2018/05/15/在php7-1中使用openssl取代mcrypt/
  • PHP openssl加密扩展使用总结
    https://www.bbsmax.com/A/ke5jNDe75r/
  • PHP 7.2+使用openssl进行加解密
    https://www.lytit.com/2018/01/26/118/
  • PHP OpenSSL扩展 - 对称加密
    https://www.jianshu.com/p/8f82e8fd123e
  • DES 加解密工具
    http://tool.chacuo.net/cryptdes
  • RSA填充方式
    https://www.jianshu.com/p/205abb4b9dc6
  • AES加密模式和填充方式,hash,md5,ca
    http://blog.sina.com.cn/s/blog_679daa6b0100zmpp.html

php如何openssl_encrypt加密解密相关推荐

  1. php openssl_encrypt加密解密

    php openssl_encrypt加密解密 public function encryptDecrypt($string, $decrypt = 'encode', $key = 'this is ...

  2. openssl_encrypt 加密解密

    DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略.所谓对称性加密即 ...

  3. 安全篇 ━━ JWT的用途和安全探讨,编码解码=\=加密解密

    一.定义 JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred betw ...

  4. php aes加密解密_JAVA实现PHP的openssl_encrypt方法

    导读:本文主要讨论如何通过 Java 方式实现 PHP 的 openssl_encrypt() 加密方法与 openssl_decrypt() 解密方法.本文例子加解密例子均采用 AES256 位 c ...

  5. php 如何使用openssl_encrypt进行aes非对称加密解密

    一.DES介绍 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法.密钥长度是64位(bit),超过位数密钥被忽略. ...

  6. laravel cookie加密解密原理

    通过控制台的 cookie 信息我们会发现,每次请求之后,关键的 cookie,如PHPSESSID.XSRF-TOKEN 都会发生变化,并且都是很长的一串字符串. 其实这是一个 json 数组,其中 ...

  7. php中des加密cbc模式,php中加密解密DES类的简单使用方法示例

    本文实例讲述了php中加密解密DES类的简单使用方法.分享给大家供大家参考,具体如下: 在平时的开发工作中,我们经常会对关键字符进行加密,可能为了安全 也可能为了规范,所以要正确使用DES加密解密 代 ...

  8. ios java aes_PHP7 AES加密解密函数_兼容ios/andriod/java对等加解密

    **PHP7.0 7.1 7.2 7.3 AES对等加解密类 函数文件_兼容ios/andriod/java等** 由于新项目规划要求使用PHP7.2开发环境,但在部分新系统中仍需使用AES加解密方式 ...

  9. PHP AES 加密解密实现

    AES 有三种算法,主要是对数据块的大小存在区别: AES-128:需要提供 16 位的密钥 key AES-192:需要提供 24 位的密钥 key AES-256:需要提供 32 位的密钥 key ...

最新文章

  1. iOS 之 UICollectionView
  2. 用createinstallmedia创建可恢复的OSX安装DMG
  3. 渐统江湖的项目原型生成工具 -- Maven Archetype
  4. SOFAMosn 无损重启/升级
  5. Android基础总结(八)Service
  6. Windows环境下的NodeJS+NPM+Bower安装配置步骤
  7. iPhone SE 3最高机身内存将增至256GB 较当前版本翻番
  8. hiho一下 第五十周 (求欧拉路径)
  9. Intellij idea 主题下载网址
  10. 雨人系统ORA-01821,时间无法识别
  11. 用matlab微分方程求解,用MATLAB求解微分方程
  12. 计算机毕业设计ssm线上学习系统8e88w系统+程序+源码+lw+远程部署
  13. 如何利用git将本地项目上传到码市、github等远程仓库
  14. CREO:CREO软件之零件【渲染】之对三维零件实现渲染图文教程之详细攻略
  15. Nginx介绍及原理简单分析
  16. 温哥华菜鸟生活攻略(1)
  17. 【spring MVC】解决spring MVC不支持PUT请求
  18. 关于阿里云服务器域名备案完整步骤
  19. final 变量可以修改
  20. 李云大连理工计算机系2015级,大连理工大学计算机科学与技术学院介绍

热门文章

  1. 1998年与2021年的一些高校学生数据等
  2. 第六章 网上银行与电子支付-2
  3. 大厂面试中三次握手延伸出来n连发你受得了?
  4. Excel中的Vlookup函数用法
  5. python随机选取字符串_Python random模块sample、randint、shuffle、choice随机函数概念和应用...
  6. 个人计算机的操作系统,个人计算机Win7操作系统
  7. 溪谷软件游戏工作室管理系统V2.1.0 游戏公会OA系统
  8. ping, telnet, tcping 命令使用及对比
  9. 中国关工委健体中心深入实施校园安全食品守护行动
  10. [Python基础19]收发电子邮件