Day 0x5 - 请求 API 前的前置动作(Part 2)[IV, Message(AES-CBC)]

0x0 前言

继昨日,Sign的篇幅跟测试的时间花比较久,因此拆成part 1, 2

0x1 IV

  • 取得 IV 很简单,把 Nonce 经过 SHA-256 计算後取尾段16字
function calcurateIv($nonce) {
    $hash = hash('SHA256', $nonce);
    return strtoupper(substr($hash, 48));
}

calcurateIv('value_nonce');
// result: "4F938A1542F4CC29"

0x2 Message encrypt (AES-CBC)

  • 以 Hash Id 为 key, IV 为 IV 进行 AES-CBC 运算
  • ** 这里就是把昨天的 data 包转 json 後加密 **
$data = [
    "ShopNo"            => "BA0026_001",
    "OrderNo"           => "A202109140001",
    "Amount"            => 16888,
    "CurrencyID"        => "TWD",
    "PayType"           => "A",
    "ATMParam"          => ["ExpireDate" => "20210921"],
    "CardParam"         => [],
    "ConvStoreParam"    => [],
    "PrdtName"          => "虚拟帐号订单",
    "ReturnURL"         => "https://127.0.0.1/Store/Return",
    "BackendURL"        => "https://127.0.0.1/AutoPush/PushSuccess"
];

看着文件,测来测去运算结果都不是文件上面写的结果,跑去看范例程序

$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);

$result = strtoupper(bin2hex($encrypt));

line 1~2: 塞满 $data_json 长度,使其可被16整除
line 3 : 进行加密
line 4 : 将 binary 转成 hex 为可读文字

而研究时发现一个事情,原来这里的 message 要把值为 null 的移除
范例程序有个写法很简单就能实现

array_filter((array) ($data));

又学到了一招了/images/emoticon/emoticon12.gif

看起来我应该也没有更简洁的写法
但需要写进laravel里面,还是自己复制贴上然後加点小料,开发者基本上都是这样 XD

function encryptMessage($data, $key, $iv) {
    $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));
}

encryptmessage($data, 'B9F9B96AA4FDB57FF75BDF4AA69B9F9B', '4F938A1542F4CC29');
// result: "9ECC2F0E04475F75FDB8BDC734DB4C8669A2FCAB2ED2A7EF4AF04C1D48238D5954A578A12DEBCC138F763979C9F90B672CBE1B78D17D329281381EAC300D8EF7706716B21920E0E0D7808C77766A50E628838D81786D0FDACE457A77799916B10FF9BE77569CCDC254A57F692684DA06A292EE9451A718B1FE10501C07B67D58062C0EB17AACA70291DA353118D2D15035EA0496C006B6BA4BC5E510B6B790555FEF4CA0F7BBC1BE43E3F3ADF9A7CAFEA847414C7C06A853BE11863C4F3B9128FC03DE12CDA71E8C54DA226DF57D405FC9B53920360C6C8525FA55039BB1727B442AD24F597769A5C52B1A1A7399E85D3218A05E7CCABC912905557E8F7827AD5A33195367E34E81DCA9350BF7F243B942C86C7C9B4C0CA3560BDCAFF76C7FCE9E39AF2AFDCD9C7E233B7A60D9C6EB9E"

0x3 今日结语

  • 想说今天应该可以很快就结束,没想到卡在 AES 加密卡了很久,看了范例程序才知道要怎麽做,真该一开始就先看要怎麽做,可以省下很多时间。
  • 这里没有实现 AES 演算法,因为理解演算法要花很大量的时间。
  • 今天写加密讯息,明天把解密讯息的部分完成

那今天就先到这,明天见


<<:  【第一天 - CTF介绍】

>>:  每个人都该学的30个Python技巧|技巧 15:新增或删除串列元素(字幕、衬乐、练习)

Day 5 : Git 多人协作

开分支 具体上要开那些branch呢? 我习惯大致简化分成三种 master 上到productio...

# Day 4 Feature status on riscv architecture

今天想要来看看 RISC-V Linux 核心有支援哪些核心功能(需要各个架构自行实作的核心功能)。...

Day4 寻找合适的 Lua 开发工具

[CC: Tweaked / Lua] 寻找合适的开发工具 在上一回,我学会了自订 CC: Twea...

[Day25] 测试一定要写好写满?时间有限怎麽办?

既然要写测试,就先来了解前端常见的几种测试类型,从最大家最常听到的单元测试(Unit Testing...

放弃实作 AES CBC 加密/解密

是的,如题 因为网路上找到的范例,几乎都是具备密码学知识基础才看得懂的 … 我完全无法使用 pyth...