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)

参数说明:

  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加密的结果。 **

参照的文档有:

相关知识文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 目录介绍 1.加密和解密1.1 问答环节1.2 加解密概况 2.对称加密和非对称加密2.1 什么是对称加密2.2 ...
    杨充211阅读 4,187评论 0 6
  • 本文主要介绍移动端的加解密算法的分类、其优缺点特性及应用,帮助读者由浅入深地了解和选择加解密算法。文中会包含算法的...
    苹果粉阅读 13,965评论 5 29
  • 加密技术的重点是加密算法,加密算法主要分为三类: 对称加密 非对称加密 不可逆加密 对称加密算法 加密过程: 将明...
    飞越_7666阅读 4,853评论 0 0
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,282评论 19 139
  • 采矿阅读 1,108评论 0 0

友情链接更多精彩内容