将mcrypt算法转换为openssl PHP(MCRYPT_TripleDES,MCRYPT_MODE_CBC)

问题描述 投票:0回答:1

我有一个使用不推荐使用的mcrypt的解密代码,我需要将此函数转换为使用openssl。关于Stackoverflow也有很多类似的问题,但是它们并没有帮助我。

这里是解密功能:

    public function decrypt($str, $key){
    //input
    $str = '9ACF38C842B3522415364850EAD1909BD43FD590BE3CBD539AD5FF6C7465973ABD61E8371E03282605ED06C994DF394244B7E7DAD54A046510484FAA724330C4C95A527D7891151E7C195D4136CBD70A87D1BD1F75473CF6B45A3F2FA8231DD71FFB4150E0BF4B133ECAA5ACC82CFD74903E21BC6EECB4B33AF39B8AF0C183A64002CFC125A55685C69A13192F3A9A4FDAC860E90C3FB6D125285E9E687BEFBE05707E131FC7ABE25FE35AB114FAE8A247B8C0F3DBA8AA74396D10564B7A0617EED913ED';
    $key = '10,10,10,10,10,10,10,10';

    //expected output:
    //'6706598320;67005551;100;00;YKB_TST_090519001330;0;0;https://setmpos.ykb.com/PosnetWebService/YKBTransactionService;posnettest.ykb.com;2225;N;0;Not authenticated;1557398383820;TL'
    outputsrand((double) microtime() * 10000000);
    $block = @mcrypt_get_block_size(MCRYPT_TripleDES, MCRYPT_MODE_CBC);
    $td = @mcrypt_module_open(MCRYPT_TripleDES, '', MCRYPT_MODE_CBC, '');
    $ks = @mcrypt_enc_get_key_size($td);

    if (strlen($str) < 16 + 8) return false;

    // Get IV
    $iv = pack("H*", substr($str, 0, 16));

    // Get Encrypted Data
    $encrypted_data = pack("H*", substr($str, 16, strlen($str)-16-8));

    // Get CRC
    $crc = substr($str, -8);

    // Check CRC
    /*if (!$this->checkCrc(substr($str, 0, strlen($str)-8), $crc)) {
        return "CRC is not valid! ($crc)";
    }*/

    // Initialize
    @mcrypt_generic_init($td, substr(strtoupper(md5($key)), 0, $ks), $iv);

    // Decrypt Data
    $decrypted_data = @mdecrypt_generic($td, $encrypted_data);

    $packing = ord($decrypted_data[strlen($decrypted_data) - 1]);

    if ($packing and ($packing < $block)) {
        for($P = strlen($decrypted_data) - 1; $P >= strlen($decrypted_data) - $packing; $P--) {
            if (ord($decrypted_data[$P]) != $packing) {
                $packing = 0;
            }
        }
    }

    return substr($decrypted_data, 0, strlen($decrypted_data) - $packing);

我尝试过:

$encrypted_data = pack("H*", substr($str, 16, strlen($str)-16-8));
$iv = pack("H*", substr($str, 0, 16));
/returns FALSE when sample input above given
$decrypted_data = openssl_decrypt($encrypted_data, 'des-ede3-cbc', $key, OPENSSL_RAW_DATA, $iv);

有人可以帮我吗?

php mcrypt encryption-symmetric php-openssl
1个回答
0
投票

我错过了关键的转换步骤,这种方式有效:

$decrypted_data = openssl_decrypt($encrypted_data, 'des-ede3-cbc', substr(strtoupper(md5($key)), 0, 24), OPENSSL_RAW_DATA, $iv);
© www.soinside.com 2019 - 2024. All rights reserved.