php开发微信小程序openssl_decrypt解密问题

来源:程序思维浏览:4690次
在开发微信小程序解析用户重要信息需要用加密数据的解密示例代码,其中要用到openssl_decrypt和base64_decode解密,下面给大家介绍一下:


先说说openssl_decrypt和openssl_encrypt

加密用到的方法:

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

参数说明:

$data 加密明文

$method 加密方法
  1. DES-ECB
  2. DES-CBC
  3. DES-CTR
  4. DES-OFB
  5. DES-CFB

$passwd 加密密钥[密码]

$options 数据格式选项(可选)【选项有:】
  1. 0
  2. OPENSSL_RAW_DATA=1
  3. OPENSSL_ZERO_PADDING=2
  4. OPENSSL_NO_PADDING=3

$iv 密初始化向量(可选)

需要注意:如果method为DES−ECB,则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��"
1
我们可以看到结果是乱码的,这时我们需要base64一下

$result = openssl_encrypt($data, $method, $passwd, OPENSSL_RAW_DATA);
var_dump(base64_encode($result));
1
2
这时结果是

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=="
1
2
我们可以看到结果是加密的乱码,需要用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"

微信小程序解密代码示例:

wxBizDataCrypt.php代码:

<?php

/**
* 对微信小程序用户加密数据的解密示例代码.
*
* @copyright Copyright (c) 1998-2014 Tencent Inc.
*/


include_once "errorCode.php";


class WXBizDataCrypt
{
    private $appid;
private $sessionKey;

/**
  * 构造函数
  * @param $sessionKey string 用户在小程序登录后获取的会话密钥
  * @param $appid string 小程序的appid
  */
public function __construct( $appid, $sessionKey)
{
  $this->sessionKey = $sessionKey;
  $this->appid = $appid;
}


/**
  * 检验数据的真实性,并且获取解密后的明文.
  * @param $encryptedData string 加密的用户数据
  * @param $iv string 与用户数据一同返回的初始向量
  * @param $data string 解密后的原文
     *
  * @return int 成功0,失败返回对应的错误码
  */
public function decryptData( $encryptedData, $iv, &$data )
{
  if (strlen($this->sessionKey) != 24) {
   return ErrorCode::$IllegalAesKey;
  }
  $aesKey=base64_decode($this->sessionKey);

       
  if (strlen($iv) != 24) {
   return ErrorCode::$IllegalIv;
  }
  $aesIV=base64_decode($iv);

  $aesCipher=base64_decode($encryptedData);

  $result=openssl_decrypt( $aesCipher, "AES-128-CBC", $aesKey, 1, $aesIV);

  $dataObj=json_decode( $result );
  if( $dataObj  == NULL )
  {
   return ErrorCode::$IllegalBuffer;
  }
  if( $dataObj->watermark->appid != $this->appid )
  {
   return ErrorCode::$IllegalBuffer;
  }
  $data = $result;
  return ErrorCode::$OK;
}

}

errorCode.php代码示例:

<?php

/**
* error code 说明.
* <ul>

*    <li>-41001: encodingAesKey 非法</li>
*    <li>-41003: aes 解密失败</li>
*    <li>-41004: 解密后得到的buffer非法</li>
*    <li>-41005: base64加密失败</li>
*    <li>-41016: base64解密失败</li>
* </ul>
*/
class ErrorCode
{
public static $OK = 0;
public static $IllegalAesKey = -41001;
public static $IllegalIv = -41002;
public static $IllegalBuffer = -41003;
public static $DecodeBase64Error = -41004;
}

?>

demo.php代码示例:

<?php

include_once "wxBizDataCrypt.php";


$appid = 'wx4f4bc4dec97d474b';
$sessionKey = 'tiihtNczf5v6AKRyjwEUhQ==';

$encryptedData="CiyLU1Aw2KjvrjMdj8YKliAjtP4gsMZM
                QmRzooG2xrDcvSnxIMXFufNstNGTyaGS
                9uT5geRa0W4oTOb1WT7fJlAC+oNPdbB+
                3hVbJSRgv+4lGOETKUQz6OYStslQ142d
                NCuabNPGBzlooOmB231qMM85d2/fV6Ch
                evvXvQP8Hkue1poOFtnEtpyxVLW1zAo6
                /1Xx1COxFvrc2d7UL/lmHInNlxuacJXw
                u0fjpXfz/YqYzBIBzD6WUfTIF9GRHpOn
                /Hz7saL8xz+W//FRAUid1OksQaQx4CMs
                8LOddcQhULW4ucetDf96JcR3g0gfRK4P
                C7E/r7Z6xNrXd2UIeorGj5Ef7b1pJAYB
                6Y5anaHqZ9J6nKEBvB4DnNLIVWSgARns
                /8wR2SiRS7MNACwTyrGvt9ts8p12PKFd
                lqYTopNHR1Vf7XjfhQlVsAJdNiKdYmYV
                oKlaRv85IfVunYzO0IKXsyl7JCUjCpoG
                20f0a04COwfneQAGGwd5oa+T8yO5hzuy
                Db/XcxxmK01EpqOyuxINew==";

$iv = 'r7BXXKkLb8qrSNn05n0qiA==';

$pc = new WXBizDataCrypt($appid, $sessionKey);
$errCode = $pc->decryptData($encryptedData, $iv, $data );

if ($errCode == 0) {
    print($data . "\n");
} else {
    print($errCode . "\n");
}

好了,微信小程序解析用户重要信息需要用加密数据的解密示例就讲解到这里,希望对大家有帮助!
精品好课
React实战视频教程仿京东移动端电商
React是前端最火的框架之一,就业薪资很高,本课程教您如何快速学会React并应用到实战,对正在工作当中或打算学习React高薪就业的你来说,那么这门课程便是你手中的葵花宝典。
Vue2+Vue3+ES6+TS+Uni-app开发微信小程序从入门到实战视频教程
2021年最新Vue2+Vue3+ES6+TypeScript和uni-app开发微信小程序从入门到实战视频教程,本课程教你如何快速学会VUE和uni-app并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己...
VUE2+VUE3视频教程从入门到精通(全网最全的Vue课程)
VUE是目前最火的前端框架之一,就业薪资很高,本课程教您如何快速学会VUE+ES6并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习VUE高薪就...
最新完整React视频教程从入门到精通纯干货纯实战
React是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React并应用到实战,教你如何解决内存泄漏,常用UI库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习React高薪就...
最新完整React+VUE视频教程从入门到精,企业级实战项目
React和VUE是目前最火的前端框架,就业薪资很高,本课程教您如何快速学会React和VUE并应用到实战,教你如何解决内存泄漏,常用库的使用,自己封装组件,正式上线白屏问题,性能优化等。对正在工作当中或打算学习Re...
jQuery视频教程从入门到精通
jquery视频教程从入门到精通,课程主要包含:jquery选择器、jquery事件、jquery文档操作、动画、Ajax、jquery插件的制作、jquery下拉无限加载插件的制作等等......
HTML5视频播放器video开发教程
适用人群1、有html基础2、有css基础3、有javascript基础课程概述手把手教你如何开发属于自己的HTML5视频播放器,利用mp4转成m3u8格式的视频,并在移动端和PC端进行播放支持m3u8直播格式,兼容...
HTML5基础入门视频教程易学必会
HTML5基础入门视频教程,教学思路清晰,简单易学必会。适合人群:创业者,只要会打字,对互联网编程感兴趣都可以学。课程概述:该课程主要讲解HTML(学习HTML5的必备基础语言)、CSS3、Javascript(学习...
收藏
扫一扫关注我们