微信小程序 加密数据解密算法 使用 PHP 的 openssl_decrypt

发布于 2022-09-05 01:28:32 字数 1253 浏览 18 评论 0

$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==';


$decrypted = openssl_decrypt($encryptedData, 'aes-256-cbc', $sessionKey, OPENSSL_RAW_DATA, $iv);
echo '解密: '.$decrypted."\n";

如上执行 直接报错

Warning: openssl_decrypt(): IV passed is 24 bytes long which is longer than the 16 expected by selected cipher

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

南烟 2022-09-12 01:28:32

解密我记得要微信文档里:微信加密说明
这里用Thinkphp3.2例子

<?php
    $iv = define_str_replace(I('get.iv'));  //把空格转成+
    $encryptedData = urldecode(I('get.encryptedData'));   //解码
    $code = define_str_replace(I('get.code')); //把空格转成+
    $msg = $this->getUserInfo($code,$encryptedData,$iv); //获取微信用户信息(openid)
    
    
    
    public function getUserInfo($code,$encryptedData,$iv)
    {
        $appid = '你的appid';
        $secret = '你的密钥';
        $grant_type='authorization_code';
        $url='https://api.weixin.qq.com/sns/jscode2session';
        $url= sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=%",$url,$appid,$secret,$code,$grant_type);
        $user_data=json_decode(file_get_contents($url));
        $session_key= define_str_replace($user_data->session_key);
        $data="";
        vendor('Vendor.WxApp.wxBizDataCrypt',realpath('./'),'.php');//引入微信解密文件
        $wxBizDataCrypt = new \WXBizDataCrypt($appid,$session_key);
        $errCode=$wxBizDataCrypt->decryptData($encryptedData,$iv,$data);
        return ['errCode'=>$errCode,'data'=>json_decode($data),'session_key'=>$session_key];
    }
    
    
    /**
     * 请求过程中因为编码原因+号变成了空格
     * 需要用下面的方法转换回来
     */
    function define_str_replace($data)
    {
        return str_replace(' ','+',$data);
    }

微信小程序官方API文档
截取引用时间:2018-06-03

加密数据解密算法
接口如果涉及敏感数据(如wx.getUserInfo当中的 openId 和unionId ),接口的明文内容将不包含这些敏感数据。开发者如需要获取敏感数据,需要对接口返回的加密数据( encryptedData )进行对称解密。 解密算法如下:

对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充。
对称解密的目标密文为 Base64_Decode(encryptedData)。
对称解密秘钥 aeskey = Base64_Decode(session_key), aeskey 是16字节。
对称解密算法初始向量 为Base64_Decode(iv),其中iv由数据接口返回。

所以解密方法为:

$sessionKey = '';
$iv = '';
$encryptedData = '';

$aesKey = base64_decode($sessionKey);// 对称解密的秘钥 aeskey
$aesIV = base64_decode($iv); // 对称解密算法初始向
$aesCipher = base64_decode($encryptedData); // 对称解密的密文
$decrypted = openssl_decrypt($aesCipher, 'AES-128-CBC', $sessionkey, OPENSSL_RAW_DATA, $aesIV);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文