php如何openssl_encrypt加密解密

php如何openssl_encrypt加密解密最近在对接客户的 CRM 系统 获取令牌时 要用 DES 方式加密解密 由于之前没有搞错这种加密方式 经过请教了 百度 和 谷歌 两个老师后 结合了多篇文档内容后 终于实现了 一 DES 介绍 DES 是对称性加密里面常见一种 全称为 DataEncrypti 即数据加密标准 是一种使用密钥加密的块算法 密钥长度是 64 位 bit 超过位数密钥被忽略 所谓对称性加密即加密和解密密钥

最近在对接客户的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,则 methodDESECBiv无需填写

二、解密用到的方法:

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

参数说明:

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

三、用法案例:

参数:

 $data = '54321';//加密明文 $method = 'DES-ECB';//加密方法 $passwd = '';//加密密钥 $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) "54321" 

(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) "54321" 

我们可以看到:默认填充方式与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) "54321" 

(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 '
    '; 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) "54321" 

参照的文档有:

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

  • 关于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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208932.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:26
下一篇 2026年3月19日 上午10:26


相关推荐

  • 粒子群算法改进思路「建议收藏」

    粒子群算法改进思路「建议收藏」粒子群算法的发展过程。粒子群优化算法(ParticalSwarmOptimizationPSO),粒子群中的每一个粒子都代表一个问题的可能解,通过粒子个体的简单行为,群体内的信息交互实现问题求解的智能性.由于PSO操作简单、收敛速度快,因此在函数优化、图像处理、大地测量等众多领域都得到了广泛的应用.随着应用范围的扩大,PSO算法存在早熟收敛、维数灾难、易于陷入局部极值等问题需要解决,主要…

    2022年5月16日
    47
  • n76e003引脚图_N76E003之串口

    n76e003引脚图_N76E003之串口N76E003 包含两个具备增强的自动地址识别和帧错误检测功能的全双工串口 由于两个串口的控制位是一样的 为了区分两个串口控制位 串口 1 的控制位以 1 结尾 例如 SCON 1 下述详例以串口 0 为例 每个串口都有一种同步工作模式 模式 0 三种全双工异步模式 模式 1 2 和 3 这意味着收发可以同时连续进行 串口接收带有接收缓存 意味着在接收的前一个数据在被读取之前 串口就能接收第二个数据 接收和发送

    2026年3月26日
    2
  • f1 score计算_F1值

    f1 score计算_F1值F1分数(F1Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的精确率和召回率。F1分数可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。1.TP、TN、FP、FN解释说明真实情况 预测结果 正例 反例 正例 TP(真正例) FN(假反例) 反例 FP(假正例) TN(真反例) 行表示预测的label值,列表示真实label值 TP:TruePositive,被判定为正样本,事实上也是

    2022年8月31日
    6
  • 1.1.2 三角形余弦定理

    1.1.2 三角形余弦定理含义 对于任意三角形 任何一边的平方等于其他两边平方的和减去这两边与它们夹角的余弦的积的两倍 几何意义 c 2 b cdotsin theta 2 a b cdotcos theta 2 b cdotsin theta 2 a 2 b cdotcos theta 2 2ab cdotcos

    2026年3月19日
    3
  • height100%和100vh的区别

    height100%和100vh的区别1vh就是当前屏幕可见高度的1%,也就是说height:100vh==height:100%;重点:但是当元素没有内容时候,设置height:100%,该元素不会被撑开,此时高度为0,但是设置height:100vh,该元素会被撑开屏幕高度一致。…

    2022年5月25日
    47
  • oracle优化:instr做join条件很慢「建议收藏」

    情况描述sql语句selectsqdbh,sqr,bm,sqrq,skdwbm,skdwmc,sqfkje,’N’asxz_flag,sjfkrq,fkdwkhyhfrom(select*fromyw_fksqdwhereto_char(sqrq,’yyyy/mm’)>=’2018/12’andstatein(‘付款’,’已审核’…

    2022年4月15日
    215

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号