Day 0xC - Debug 地狱第三天,终於逃脱了 (建立订单)

0x1 前言

从 Day 0xA 开始撞墙,撞到今天总算解出来了
几个问题请让我娓娓道来

0x2 好臭的虫 Part 2

  • 官方有提供加解密 DEMO 页:

  • 一步一步地对,然而发现错的地方,就是昨天对到改的函数 calculateHashId, encryptMessage

    1. calculateHashId 昨天提到我这样写没有对齐 4 位对吧,於是加了 str_pad 函数来补完,但没想到的是,这个函数的第三个参数预设值为补右边,自己误会成字串靠右,左边补字
    2. encryptMessage 昨天说要做key的排序对吧,请忘了吧,范例程序没有写要排序,自己以为需要跟 Sign 一样要排序,然後就各种爆炸/images/emoticon/emoticon02.gif

程序如下:

// app/Http/Controllers/Sinopac.php
...
public function calcHashId(): string
{
    $a = $b = '';
    $length = strlen($this->key_a1);
    for ($i = 0; $i < $length; $i += 4) {
        $part_of_a = dechex(hexdec(substr($this->key_a1, $i, 4)) ^ hexdec(substr($this->key_a2, $i, 4)));
        $part_of_b = dechex(hexdec(substr($this->key_b1, $i, 4)) ^ hexdec(substr($this->key_b2, $i, 4)));
        $a .= str_pad($part_of_a, 4, "0", STR_PAD_LEFT);
        $b .= str_pad($part_of_b, 4, "0", STR_PAD_LEFT);
    }
    return strtoupper($a . $b);
}
...
public function encryptMessage($data, $key, $iv): string
{
    $data = json_encode(array_filter((array)($data)));

    $padding = 16 - (strlen($data) % 16);
    $data .= str_repeat(chr($padding), $padding);
    $encrypt = openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

    return strtoupper(bin2hex($encrypt));
}
...

用 Postman测试出来的结果,终於不是 E3501 – 讯息内容错误
https://ithelp.ithome.com.tw/upload/images/20210922/20141805wu4JaSakJz.png

0x3 今日结语

今天在解不出来,真的会想放弃,错到一个怀疑人生
明天来把回覆的讯息解密以及完成验证吧


<<:  DAY7 第一周回顾

>>:  Day 8 超多的范例?怎麽办呢?

PHP 扩展库(extension) 和 套件(package)

PHP extension 使用 C 语言遵循 PHP 介面开发让 PHP 功能增加的函式库, 一般...

自动化 End-End 测试 Nightwatch.js 与 BrowserStack

BrowserStack 一个提供各式浏览器、移动装备的平台,前面虽然有稍微提到这个东西,不过都没什...

Day 3 — 拆解 GAS 的执行

昨天我们写了第一个 GAS 程序: Hello World ,今天我们来拆解一下我们到底写了什麽东西...

【Day 08】- 有着资料清洗功能的 Requests-HTML

前情提要 前一篇文章带大家看了Requests 库的使用,使用它发送了 GET POST 的请求,并...

4.MYSQL语法简介

在SQL中写法很重要,因为写法会影响着最後输出的结果 如果我们要写出自己的资料库就一定要先了解他们的...