php如何openssl_encrypt加密解密
最近在对接客户的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)
参数说明:
- $data 加密明文
$method 加密方法
- DES-ECB
- DES-CBC
- DES-CTR
- DES-OFB
- DES-CFB
- $passwd 加密密钥[密码]
$options 数据格式选项(可选)【选项有:】
- 0
- OPENSSL_RAW_DATA=1
- OPENSSL_ZERO_PADDING=2
- OPENSSL_NO_PADDING=3
- $iv 密初始化向量(可选)
需要注意:如果$method为DES-ECB,则$iv无需填写
二、解密用到的方法:
openssl_decrypt($data, $method, $password, $options, $iv)
参数说明:
- $data 要解密的数据
- 其他参数同加密方法
三、用法案例:
参数:
$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/546... - 关于mcrypt_encrypt和openssl_encrypt加密结果不一致的解决
http://www.heylc.com/fuanyuop...
相关知识文章
- RSA密码传输加密方案
https://wenku.baidu.com/view/... - iOS 实现对称加密多种填充方式(ANSIX923、ISO10126、Zero)
https://www.jianshu.com/p/7b6... - PHP由mcrypt扩展加密改为openssl扩展加密
https://www.xxling.com/blog/a... - PHP用openssl_encrypt代替mcrypt_encrypt
https://coderlife.cn/1624.html - AES加密CBC模式兼容互通四种编程语言平台【PHP、Javascript、Java、C#】
https://my.oschina.net/Jacker... - 在PHP7.1中使用openssl取代mcrypt
https://swoole.app/2018/05/15... - PHP openssl加密扩展使用总结
https://www.bbsmax.com/A/ke5j... - PHP 7.2+使用openssl进行加解密
https://www.lytit.com/2018/01... - PHP OpenSSL扩展 - 对称加密
https://www.jianshu.com/p/8f8... - DES 加解密工具
http://tool.chacuo.net/cryptdes - RSA填充方式
https://www.jianshu.com/p/205... - AES加密模式和填充方式,hash,md5,ca
http://blog.sina.com.cn/s/blo...
原文地址:https://segmentfault.com/a/1190000016804661
php如何openssl_encrypt加密解密的更多相关文章
- PHP7.* AES的加密解密
之前写过一篇: PHP AES的加密解密-----[弃用] 使用的是php5.*之前的mcrypt_decrypt 函数,该函数已经在php7.1后弃用了,上马的是openssl的openssl_en ...
- laravel cookie加密解密原理
通过控制台的 cookie 信息我们会发现,每次请求之后,关键的 cookie,如PHPSESSID.XSRF-TOKEN 都会发生变化,并且都是很长的一串字符串. 其实这是一个 json 数组,其中 ...
- php中签名公钥、私钥(SHA1withRSA签名)以及AES(AES/ECB/PKCS5Padding)加密解密详解
由于http请求是无状态,所以我们不知道请求方到底是谁.于是就诞生了签名,接收方和请求方协商一种签名方式进行验证,来取得互相信任,进行下一步业务逻辑交流. 其中签名用得很多的就是公钥私钥,用私钥签名, ...
- PHP实现sha1加密AES算法加密解密数据
一.加密代码如下: /** * * @param string $string 需要加密的字符串 * @param string $key 密钥 * @return string */ public ...
- PHP7.2中AES加密解密方法mcrypt_module_open()替换方案 Function mcrypt_get_block_size() is deprecated
直接粘代码,该类是基于微信公众号消息加密解密所提供的PHP DEMO改造而来,目前使用于彬彬大学APP接口token校验中. php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被 ...
- PHP的学习--RSA加密解密
PHP服务端与客户端交互或者提供开放API时,通常需要对敏感的数据进行加密,这时候rsa非对称加密就能派上用处了. 举个通俗易懂的例子,假设我们再登录一个网站,发送账号和密码,请求被拦截了. 密码没加 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现
场景:java 作为客户端调用已有的一个.net写的server的webservice,输入string,返回字节数组. 问题:返回的值不是自己想要的,跟.net客户端直接调用总是有差距 分析:平台不 ...
- php使用openssl进行Rsa长数据加密(117)解密(128) 和 DES 加密解密
PHP使用openssl进行Rsa加密,如果要加密的明文太长则会出错,解决方法:加密的时候117个字符加密一次,然后把所有的密文拼接成一个密文:解密的时候需要128个字符解密一下,然后拼接成数据. 加 ...
随机推荐
- ActiveMQ学习笔记(17)----Message高级特性(一)
1. Messaage Properties ActiveMQ支持很多消息属性,具体可以参考 http://activemq.apache.org/activemq-message-propertie ...
- 3ds Max灯光教程之卧室灯光布局实例
对于设计师来说要做好一张好的作品效果图包括很多比如:“造型.色彩搭配.灯光气氛.构图角度等等,上次给大家详细的分析了下产品渲染中摄像机的构图及原理.本期教程来跟大家讨论一下max场景灯光布局问题.以卧 ...
- [SDOI2008]沙拉公主的困惑 线性筛_欧拉函数_逆元_快速幂
Code: #include<cstdio> using namespace std; typedef long long ll; const int maxn=10000000+1; l ...
- POJ-1743 Musical Theme 字符串问题 不重叠最长重复子串
题目链接:https://cn.vjudge.net/problem/POJ-1743 题意 给一串整数,问最长不可重叠最长重复子串有多长 注意这里匹配的意思是匹配串的所有元素可以减去或者加上某个值 ...
- BZOJ 2560(子集DP+容斥原理)
2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 757 Solved: 497[Submit][Status][Discuss] ...
- Opencv 三对角线矩阵(Tridiagonal Matrix)解法之(Thomas Algorithm)
1. 简介 三对角线矩阵(Tridiagonal Matrix),结构如公式(1)所示: aixi−1+bixi+cixx+1=di(1) 其中a1=0,cn=0.写成矩阵形式如(2): ⎡⎣⎢⎢⎢⎢ ...
- 洛谷 P3914 染色计数
P3914 染色计数 题目描述 有一颗NN个节点的树,节点用1,2,\cdots,N1,2,⋯,N编号.你要给它染色,使得相邻节点的颜色不同.有MM种颜色,用1,2,\cdots,M1,2,⋯,M编号 ...
- TextView超链接
这里面涉及两个知识点--超链接和跳转.以下进行逐一解说: 1.实现超链接: 1.1形成超链接文本 public static SpannableString getUserlink(String us ...
- STL_算法_查找算法(binary_search、includes)
C++ Primer 学习中.. . 简单记录下我的学习过程 (代码为主) 全部容器适用(O(log(n))) 已序区间查找算法 binary_search //二分查 ...
- 页面头部带loading进度指示的jQuery滚动页面特效
这是一款非常有用且效果非常酷的jQuery页面头部带loading进度指示的滚动页面特效. 该特效在页面滚动的时候页面头部有Loading进度条指示当前页面滚动的位置,这能够让用户知道当前阅读的地方距 ...