前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >php接口如何openssl_encrypt 使用 aes和des ,base64加密解密总结「建议收藏」

php接口如何openssl_encrypt 使用 aes和des ,base64加密解密总结「建议收藏」

作者头像
全栈程序员站长
发布2022-07-19 09:46:55
2.1K0
发布2022-07-19 09:46:55
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是全栈君。

一、DES介绍

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

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

加密用到的方法:

代码语言:javascript
复制
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,则method为DES−ECB,则iv无需填写

二、解密用到的方法:

代码语言:javascript
复制
openssl_decrypt($data, $method, $password, $options, $iv)

参数说明:

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

三、用法案例:

参数:

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

(1) 默认填充方式:

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

(3) OPENSSL_ZERO_PADDING方式

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

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

在openssl_encrypt前加上填充过程

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

补码原理

在对称加密中,可以概分为两种模式加密,流加密以及块加密,当我们使用块加密(也就是分组加密)的时候,例如AES、DES,每次是对固定大小的分组数据进行处理。但是大多数需要加密的数据并不是固定大小的倍数长度。例如AES数据块为128位,也就是16字节长度,而需要加密的长度可能为15、26等等。为了解决这个问题,我们就需要对数据进行填补操作,将数据补齐至对应块长度。

接下来呢讲一下关于数据填充ANSIX923ISO10126PKCS7以及Zero具体的补码原理。

注,补码原理来自于文章Padding (cryptography),读中文的小伙伴们可以查看这篇 关于PKCS5Padding与PKCS7Padding的区别.

特定的,为了使算法可以逆向去除多余的填充字符,所以当数据长度恰好等于块长度的时候,需要补足块长度的字节.例如块长度为8,数据长度为8,则填充字节数等于8.

php7 openssl_decrypt AES的ECB与CBC加解密

php7.2版本用openssl_encrypt代替mcrypt_encrypt,导致以往自己写的Aes加密类不能用。

这次项目客户端用的是 AES-128-ECB 加密,我用在线AES工具来测试,发现自己写的加解密方法得到的值不一样。而最终发现是加密的key不是16位长,导致ios客户端与服务器php的加解密不一致。后商讨key为16位长,遂问题解决。下面是 AES-128-ECB 加密类;

代码语言:javascript
复制
class Aes
{
    //密钥 须是16位
    public $key ;

    /**
     * 解密字符串
     * @param string $data 字符串
     * @return string
     */
    public function __construct()
    {
    	$this->key = '1234567890123456';
    }

    public  function decode($str)
    {
        return openssl_decrypt(base64_decode($str),"AES-128-ECB",$this->key,OPENSSL_RAW_DATA);
    }

    /**
     * 加密字符串
     * @param string $data 字符串
     * @return string
     */
    public  function encode($str)
    {
        return base64_encode(openssl_encrypt($str,"AES-128-ECB",$this->key,OPENSSL_RAW_DATA));
    }

}

若你是采用CBC加密,则还需排序$iv偏移量,如下面是AES-128-CBC加解密类:

代码语言:javascript
复制
class Aes
{
    //密钥 须是16位
    public $key ;

    //偏移量
    public $iv = '1234567890123456';

    /**
     * 解密字符串
     * @param string $data 字符串
     * @return string
     */
    public function __construct()
    {
    	$this->key = '1234567890123456';
    }

    public  function decode($str)
    {
        return openssl_decrypt(base64_decode($str),"AES-128-CBC",$this->key,OPENSSL_RAW_DATA, $this->iv);
    }

    /**
     * 加密字符串
     * @param string $data 字符串
     * @return string
     */
    public  function encode($str)
    {
        return base64_encode(openssl_encrypt($str,"AES-128-CBC",$this->key,OPENSSL_RAW_DATA, $this->iv));
    }

}

参考: https://www.jianshu.com/p/7b6f5aaa7680

https://my.oschina.net/u/3403514/blog/1809008

参考:https://segmentfault.com/a/1190000016804661

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年2月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、DES介绍
  • 加密用到的方法:
  • 二、解密用到的方法:
  • 三、用法案例:
  • 补码原理
相关产品与服务
SSL 证书
腾讯云 SSL 证书(SSL Certificates)为您提供 SSL 证书的申请、管理、部署等服务,为您提供一站式 HTTPS 解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档