快手电商开放平台消息PHP解密

在对接快手电商开放平台消息接口的时候发现文档只提供了一个java SDK。奈何目前不会Java,文档只提供了其他开放者一句话,差点把我强行逼退

自行解密步骤
使用Base64反编码密钥,使用反编码之后的密钥对接收到的消息体进行AES解密即可

单看这一句话我觉着是不可能写出来的,又琢磨了一下java代码,下载下来发现打不开。害,无奈之下发了工单,快手技术回复了一段具体Java解密代码

public static String decode(String message, String privateKey) throws KsMerchantApiException {
    try {
        if (KsStringUtils.isBlank(message) || KsStringUtils.isBlank(privateKey)) {
            throw new KsMerchantApiException("decode param is blank");
        }
       Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
        byte[] key = Base64.decodeBase64(privateKey);
        SecretKeySpec keySpec = new SecretKeySpec(key, KEY_ALGORITHM);
        cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(new byte[16]));
        return new String(cipher.doFinal(Base64.decodeBase64(message)), CHARSET);
    } catch (Exception e) {
        throw new KsMerchantApiException("decode message fail", e);
    }
}

于是经过比克日志各种尝试之后得出正确解密方式 ,从此学会看Java写PHP 走向人生癫峰。。

/**
* @Author xiadmin
* @DateTime 2020-12-04T16:30:50+0800
* @param string $message加密数据
* @param string $privateKey消息密钥
*/
function decode($message, $privateKey)
{
    // base64 反编码数据
    $message = base64_decode($message);
    // base64 反编码密钥
    $key = base64_decode($privateKey);
    // Iv向量我根据demo代码猜应该是反编码密钥后的前16位。 一开始猜的解密方式是 aes-256-cbc 需要向量

   // 实际上加密方式是 AES-128-CBC,是不需要向量的
   // $iv = substr($key, 0, 16);
    // 只知道Java的加密是 采用AES加密。我PHP对应 aes-256-cbc? 不知道对不对
   $result = openssl_decrypt($message, 'AES-128-CBC', $key, OPENSSL_RAW_DATA);
    return $result;
}

上面是尝试的过程,不需要的话可以直接使用下面这个

/**
* @Author xiadmin
* @DateTime 2020-12-04T16:30:50+0800
* @param string $data 加密数据
* @param string $key 消息密钥
*/
public function aes_decrypt($data, $key){
    return openssl_decrypt(base64_decode($data), 'AES-128-CBC', base64_decode($key), OPENSSL_RAW_DATA);
}
php转贴的文章

Composer 2.0 发布了

2020-11-20 17:36:19

工作日志随笔

网站升级 https 需要注意什么

2020-12-6 23:19:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧