求助:JAVA加密的数据PHP解密

已经尝试过用 php 解密,但是对 java 代码一知半解,最终解密失败,希望帮忙解答一下。

encodingAesKey:yPynf9C4b41bjisixYRhPQYseYMo4EuT9LsYsXyRwuc

java 加密后的密文:GOjohJfhlQl51zoHKWak+/eR5dND3kyOuFL83Kb4nkYmIA654rqRLyDeb5GKBmwiE5bAxcAtUUjKPsNqveDfWx+C4Fyp57CKcwbjV2rlfNNFzl//VU/Jns5VAAuQLXmT

以下是 java 的 解密示例,希望能用 php 解密出来

代码已被折叠,点此展开

java 端解密部分变量打印结果如下:
求助:JAVA加密的数据PHP解密

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案
class CryptUtil {
    protected $aesKey;

    public function __construct($encodingAesKey) {
        $this->aesKey = base64_decode(str_replace(' ', '', $encodingAesKey));
    }

    public function decrypt($encryptedText) {
        try {
            $cipher = "aes-256-cbc";
            $iv = substr($this->aesKey, 0, 16);
            $encrypted = base64_decode($encryptedText);
            $original = openssl_decrypt($encrypted, $cipher, $this->aesKey, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

            $trueContent = $this->decode($original);
            $networkOrder = substr($trueContent, 16, 4);
            $contentLength = $this->bytesNetworkOrder2Number($networkOrder);
            $trueContent = substr($trueContent, 20, $contentLength);
            return $trueContent;
        } catch (Exception $e) {
            return null;
        }
    }

    public static function decode($decrypted) {
        $pad = ord($decrypted[strlen($decrypted) - 1]);
        if ($pad < 1 || $pad > 32) {
            $pad = 0;
        }
        return substr($decrypted, 0, strlen($decrypted) - $pad);
    }

    private static function bytesNetworkOrder2Number($bytesInNetworkOrder) {
        $sourceNumber = 0;
        for ($i = 0; $i < 4; $i++) {
            $sourceNumber <<= 8;
            $sourceNumber |= ord($bytesInNetworkOrder[$i]);
        }
        return $sourceNumber;
    }
}

试试看

1年前 评论
wjx (楼主) 1年前
讨论数量: 6

试一下

<?php

$aesKey = 'yPynf9C4b41bjisixYRhPQYseYMo4EuT9LsYsXyRwuc';
$aesKey = base64_decode($aesKey);
$iv = substr($aesKey, 0, 16);
$encryptText = 'GOjohJfhlQl51zoHKWak+/eR5dND3kyOuFL83Kb4nkYmIA654rqRLyDeb5GKBmwiE5bAxcAtUUjKPsNqveDfWx+C4Fyp57CKcwbjV2rlfNNFzl//VU/Jns5VAAuQLXmT';
$encryptText = base64_decode($encryptText);

$plainText = openssl_decrypt($encryptText, 'AES-256-CBC', $aesKey, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);
var_dump($plainText);
1年前 评论

// 将加密密钥转换成 AES 专用秘钥 $key = substr (openssl_digest (openssl_digest ($secretKey, 'sha1', true), 'sha1, true), 0, 0);

我之前也做过这两个的转换,因为没有转换这个加密密钥,一直有问题。看这种是不是能给你提供个思路呢?

1年前 评论
class CryptUtil {
    protected $aesKey;

    public function __construct($encodingAesKey) {
        $this->aesKey = base64_decode(str_replace(' ', '', $encodingAesKey));
    }

    public function decrypt($encryptedText) {
        try {
            $cipher = "aes-256-cbc";
            $iv = substr($this->aesKey, 0, 16);
            $encrypted = base64_decode($encryptedText);
            $original = openssl_decrypt($encrypted, $cipher, $this->aesKey, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv);

            $trueContent = $this->decode($original);
            $networkOrder = substr($trueContent, 16, 4);
            $contentLength = $this->bytesNetworkOrder2Number($networkOrder);
            $trueContent = substr($trueContent, 20, $contentLength);
            return $trueContent;
        } catch (Exception $e) {
            return null;
        }
    }

    public static function decode($decrypted) {
        $pad = ord($decrypted[strlen($decrypted) - 1]);
        if ($pad < 1 || $pad > 32) {
            $pad = 0;
        }
        return substr($decrypted, 0, strlen($decrypted) - $pad);
    }

    private static function bytesNetworkOrder2Number($bytesInNetworkOrder) {
        $sourceNumber = 0;
        for ($i = 0; $i < 4; $i++) {
            $sourceNumber <<= 8;
            $sourceNumber |= ord($bytesInNetworkOrder[$i]);
        }
        return $sourceNumber;
    }
}

试试看

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