问下有没有同时懂java,懂php的同学,帮忙看下这是怎么解密的?

我这边对接一个数据接口,他传过来的数据是加密,然后他是用java写的,我不懂java,有谁java厉害的,能帮忙看看是怎么解密,换成php版的?

问下有没有同时懂java,懂php的同学,帮忙看下这是怎么解密的?
上面是key,和偏移量iv
对了他传给我的数据:
{“content”:”JouGJbH6M3aO/D6Bgm7KIyvdUzIiNNa7qiccrBaF9q1GyWm7pu4XAmqwJNOtXV+F6SG+3E/6Y5mb29soNJzXOMGOm2wAg7h0XE+KP/VoqSF3f6g/qXMFx1ZOPEIDmvOPCh3zbJLbnN2l+PbHAf3mpKOFoQMDwEul3aFB9AOiq1YQ9/+RF6TdDmimQPdsC+fPmR8dph3wnoWhmhPvK19dww==”}
content的值

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
最佳答案


function decrypt($encrypted)
{
    $key = "1234567890123456"; // 密钥,长度16
    $iv = "1234567896543210"; // 偏移量,长度16

    try {
        $ivSpec = $iv;
        $keySpec = $key;
        $cipher = openssl_decrypt(base64_decode($encrypted), 'AES-128-CBC', $keySpec, OPENSSL_RAW_DATA, $ivSpec);
        return $cipher;
    } catch (Exception $ex) {
        var_dump($ex->getMessage());
        // 处理异常(如果需要的话)
        return null;
    }
}

// 使用示例
$encryptedText = "JouGJbH6M3aO/D6Bgm7KIyvdUzIiNNa7qiccrBaF9q1GyWm7pu4XAmqwJNOtXV+F6SG+3E/6Y5mb29soNJzXOMGOm2wAg7h0XE+KP/VoqSF3f6g/qXMFx1ZOPEIDmvOPCh3zbJLbnN2l+PbHAf3mpKOFoQMDwEul3aFB9AOiq1YQ9/+RF6TdDmimQPdsC+fPmR8dph3wnoWhmhPvK19dww=="; // 你的加密文本
$decryptedText = decrypt($encryptedText);
echo "解密结果: " . $decryptedText;

/**

解密结果: [{"devid":"645b3bc92080806ab6d1b561","devtype":32768,"expand":{"allpower":0.8,"lasttime":"2023-11-28 16:06:00"},"read_time":"2023-11-28 16:06:00"}]
 */
1年前 评论
donggan (楼主) 1年前
lmdfx (作者) 1年前
讨论数量: 18


function decrypt($encrypted)
{
    $key = "1234567890123456"; // 密钥,长度16
    $iv = "1234567896543210"; // 偏移量,长度16

    try {
        $ivSpec = $iv;
        $keySpec = $key;
        $cipher = openssl_decrypt(base64_decode($encrypted), 'AES-128-CBC', $keySpec, OPENSSL_RAW_DATA, $ivSpec);
        return $cipher;
    } catch (Exception $ex) {
        var_dump($ex->getMessage());
        // 处理异常(如果需要的话)
        return null;
    }
}

// 使用示例
$encryptedText = "JouGJbH6M3aO/D6Bgm7KIyvdUzIiNNa7qiccrBaF9q1GyWm7pu4XAmqwJNOtXV+F6SG+3E/6Y5mb29soNJzXOMGOm2wAg7h0XE+KP/VoqSF3f6g/qXMFx1ZOPEIDmvOPCh3zbJLbnN2l+PbHAf3mpKOFoQMDwEul3aFB9AOiq1YQ9/+RF6TdDmimQPdsC+fPmR8dph3wnoWhmhPvK19dww=="; // 你的加密文本
$decryptedText = decrypt($encryptedText);
echo "解密结果: " . $decryptedText;

/**

解密结果: [{"devid":"645b3bc92080806ab6d1b561","devtype":32768,"expand":{"allpower":0.8,"lasttime":"2023-11-28 16:06:00"},"read_time":"2023-11-28 16:06:00"}]
 */
1年前 评论
donggan (楼主) 1年前
lmdfx (作者) 1年前
随波逐流

建议给一组,明文和密文,要不然不好验证

1年前 评论
ShiKi

给一组数据方便验证

1年前 评论
donggan (楼主) 1年前

可参考我之前的回答:问答:求助:JAVA加密的数据PHP解密
然后PHP的openssl_decrypt默认填充行为是PKCS7Padding,但在某些情况下,其实和PKCS5Padding是相同的,如果你发现有差异的话,可再参考我之前的另一个回答: 问答:求助:JAVA加密的数据PHP解密
结合一下两份代码,把里面的PKCS5Padding填充函数unPkcsPadding($str)拿出来用。

1年前 评论


function decrypt($encrypted)
{
    $key = "1234567890123456"; // 密钥,长度16
    $iv = "1234567896543210"; // 偏移量,长度16

    try {
        $ivSpec = $iv;
        $keySpec = $key;
        $cipher = openssl_decrypt(base64_decode($encrypted), 'AES-128-CBC', $keySpec, OPENSSL_RAW_DATA, $ivSpec);
        return $cipher;
    } catch (Exception $ex) {
        var_dump($ex->getMessage());
        // 处理异常(如果需要的话)
        return null;
    }
}

// 使用示例
$encryptedText = "JouGJbH6M3aO/D6Bgm7KIyvdUzIiNNa7qiccrBaF9q1GyWm7pu4XAmqwJNOtXV+F6SG+3E/6Y5mb29soNJzXOMGOm2wAg7h0XE+KP/VoqSF3f6g/qXMFx1ZOPEIDmvOPCh3zbJLbnN2l+PbHAf3mpKOFoQMDwEul3aFB9AOiq1YQ9/+RF6TdDmimQPdsC+fPmR8dph3wnoWhmhPvK19dww=="; // 你的加密文本
$decryptedText = decrypt($encryptedText);
echo "解密结果: " . $decryptedText;

/**

解密结果: [{"devid":"645b3bc92080806ab6d1b561","devtype":32768,"expand":{"allpower":0.8,"lasttime":"2023-11-28 16:06:00"},"read_time":"2023-11-28 16:06:00"}]
 */
1年前 评论
donggan (楼主) 1年前
lmdfx (作者) 1年前

我觉得有个比较好笑的点,很多人对数据安全传输做的处理就是这种类似的对称加密或者非对称加密,然后用http发给送。

难道就没有了解过https以及加密套件吗?实在担心,就用证书双向认证。 所以如果你们对数据安全很上心的话,我建议使用 https+强加密套件,双向认证

1年前 评论
donggan (楼主) 1年前
33qis (作者) 1年前
Imuyu 1年前

用GPT 能解除你的困扰

1年前 评论
ShiKi
    $str = '{"content":"JouGJbH6M3aO/D6Bgm7KIyvdUzIiNNa7qiccrBaF9q1GyWm7pu4XAmqwJNOtXV+F6SG+3E/6Y5mb29soNJzXOMGOm2wAg7h0XE+KP/VoqSF3f6g/qXMFx1ZOPEIDmvOPCh3zbJLbnN2l+PbHAf3mpKOFoQMDwEul3aFB9AOiq1YQ9/+RF6TdDmimQPdsC+fPmR8dph3wnoWhmhPvK19dww=="}';
    $data = json_decode($str, true);
    $content = $data['content'];
    $key = '1234567890123456';
    $iv = '1234567896543210';
    $decrypted = openssl_decrypt($content, 'AES-128-CBC', $key, 0, $iv);
1年前 评论

看选的答案没有做解补码,如果有出现补码的话不去除补码会出现结果错误问题,注意去除补码

1年前 评论

上边注释不是写了吗?使用的AES-128-CBC模式加密,java加密代码不是重点,重点是如何使用php实现AES-128-CBC加密。

file

简单示例实现:用内置函数openssl实现。

function encrypt(string $str, string $key, string $iv):string {
    $str = pkcs5Padding($str);
    $result = openssl_encrypt($str, 'AES-128-CBC', $key, OPENSSL_NO_PADDING, $iv);
    if ($result === false) {
        throw new Exception('系统异常,加密失败');
    }
    return base64_encode($result);
}

function decrypt(string $str, string $key, string $iv): string {
    $str = base64_decode($str);
    $result = openssl_decrypt($str, 'AES-128-CBC', $key, OPENSSL_NO_PADDING, $iv);
    if ($result === false) {
        throw new Exception('系统异常,解密失败');
    }
    return unPkcs5Padding($result);
}


function pkcs5Padding(string $str, int $blockSize = 8): string {
    $strlen = mb_strlen($str, '8bit');
    $strPassphraseRemainder = $strlen % $blockSize;
    if ($strPassphraseRemainder) {
        $pad = $blockSize - $strPassphraseRemainder;
        $str = $str . str_repeat(chr($pad), $pad);
    }

    return $str;
}

function unPkcs5Padding($str): string {
    $pad = ord(mb_substr($str, -1, encoding: '8bit'));
    return mb_substr($str, 0, -1 * $pad, '8bit');
}
  • 注意事项
  1. JAVA加密代码,使用PKCS5填充(即填充位数为8位),openssl_encrypt在不指定option时,默认使用PKCS7填充,加解密时填充需要转换PKSC5,因此需要指定option(释义参考如下),自主处理填充;关于option示例代码做了取巧处理,OPENSSL_NO_PADDING常量值为3,正好等于OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING按位或,由于指定了OPENSSL_RAW_DATA,因此会输出原始的二进制字符串,需要对结果进行base64编码。
    #OPENSSL_RAW_DATA=1
    #OPENSSL_ZERO_PADDING=2
    options = 0
    -> PKCS7 padding, Base64 Encode
    options = 1
    -> PKCS7 padding, No Base64 Encode (RAW DATA)
    options = 2
    -> No padding, Base64 Encode
    options = 3  ( 1 OR 2 )
    -> No padding, No Base64 Encode (RAW DATA)
  2. 如何确定加密算法的ivkey长度,可参考内置函数。
    // php 5.3.3引入
    openssl_cipher_iv_length(string $cipher_algo);
    // php 8.2 引入
    openssl_cipher_key_length(string $cipher_algo);
1年前 评论

我们也经常对接外部接口,给的加解密sdk基本都是java,我们一般用Java写个springboot来解决

1年前 评论

file 这位同学都懂

1年前 评论
aodaobi 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!