從 Day 0xA 開始撞牆,撞到今天總算解出來了
幾個問題請讓我娓娓道來
官方有提供加解密 DEMO 頁:
一步一步地對,然而發現錯的地方,就是昨天對到改的函數 calculateHashId
, encryptMessage
calculateHashId
昨天提到我這樣寫沒有對齊 4 位對吧,於是加了 str_pad
函數來補完,但沒想到的是,這個函數的第三個參數預設值為補右邊,自己誤會成字串靠右,左邊補字
encryptMessage
昨天說要做key的排序對吧,請忘了吧,範例程式沒有寫要排序,自己以為需要跟 Sign 一樣要排序,然後就各種爆炸
程式如下:
// 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 – 訊息內容錯誤
了
今天在解不出來,真的會想放棄,錯到一個懷疑人生
明天來把回覆的訊息解密以及完成驗證吧