在PHP中使用pbewithmd5和tripledes进行解密

在PHP中使用pbewithmd5和tripledes进行解密,php,encryption,phpseclib,tripledes,Php,Encryption,Phpseclib,Tripledes,我正在致力于将API集成到我们的web应用程序中。在初始请求中,API返回一个响应,该响应使用PBewithmd5和Tripledes加密进行加密,然后使用Base64编码。我有一个事先提供给我的加密密码。由于我缺乏经验和PBewithmD5和Tripledes文档,我正在努力解密响应。我试过使用,但运气不好 这是我的phpseclib代码 $res = $response->getBody()->getContents(); $res = base6

我正在致力于将API集成到我们的web应用程序中。在初始请求中,API返回一个响应,该响应使用PBewithmd5和Tripledes加密进行加密,然后使用Base64编码。我有一个事先提供给我的加密密码。由于我缺乏经验和PBewithmD5和Tripledes文档,我正在努力解密响应。我试过使用,但运气不好

这是我的phpseclib代码

        $res = $response->getBody()->getContents();
        $res = base64_decode($res);
        // this is provided by vendor
        $password = self::PASSWORD;
        // I tried this too.
        //$password = md5(utf8_encode($password), true);

        $tripleDes = new TripleDES(TripleDES::MODE_CBC);
        $tripleDes->setKey($password);
        $ddd = $tripleDes->decrypt($res);

        // this is returning false
        var_dump($ddd); die();
您能给我提供一些如何在PHP中使用PBewithmd5和Tripledes的示例,或者给我指一些方向或文档。

PBewithmd5和Tripledes使用基于MD5的算法进行密钥/IV推导,需要密码、salt和迭代计数作为参数。对于CBC模式下的三重加密(
des-ede3-CBC
),应用24字节密钥

PBEWithMD5AndTripleDES是Oracle对中定义的基于密码的加密的专有扩展,用于支持更长的密钥。由于它是专有的,并且由于MD5等过时的算法以及与AES相比速度相对较慢的TripleDES,因此不应将其用于新的实现,而应仅用于与遗留代码的兼容性

我在网上没有找到任何支持PBewithmd5和三元组开箱即用的PHP库(仅适用于不同的PBewithmd5和DE,例如)。对于自定义实现,您实际上只需要对key/IV进行派生。因此,如果您也找不到实现,但有充分的理由使用此算法:是一个实现派生的Java代码。PHP的端口可以是:

function deriveKeyIV($key, $salt, $count){
    
    $result = "";
    for ($var = 0; $var < 4; $var++){
        if($salt[$var] != $salt[$var + 4])
        break;
    }
    if ($var == 4){
        for ($var = 0; $var < 2; $var++){
            $tmp = $salt[$var];
            $salt[$var] = $salt[3 - $var];
            $salt[3 - 1] = $tmp;
        }
    }
    for ($var = 0; $var < 2; $var++){
    
        $toBeHashed = substr($salt, $var * (strlen($salt) / 2), strlen($salt) / 2);
        for ($var2 = 0; $var2 < $count; $var2++){
            $toBeHashed = hash ("MD5", $toBeHashed . $key, TRUE);
        }
        $result = $result . $toBeHashed;
    }
    
    return $result;
}
输出:

543650085edbbd6c26149c53a57cdd85871fd91c0f6d0be4
d7ffaa69502309ab
m4pye0texirKz1OeKqyKRJ5fSgWcpIPEhSok1SBDzgPthsw9XUuoiqXQBPdsVdUr
作为参考,我使用了一个Java实现,更准确地说是PBewithmd5的实现和提供程序的三元组,这给出了相同的结果

请注意,PBEWithMD5AndTripleDES的原始实现只允许大小正好为8字节的salt(尽管派生函数可以处理较大的salt),否则会引发异常(salt必须为8字节长)。要添加此约束,可以在
deriveKeyIV
的开头添加以下内容:

if (strlen($salt) != 8) {
    throw new Exception('Salt must be 8 bytes long');
}

如果没有关于加密部分的更多信息,我们将很难帮助您。您命名为“PBEWithMD5AndTripleDES”,但我觉得这是密钥派生的算法。所以我们需要知道使用哪种加密算法和模式。此外,提供一个样本数据集(明文、密钥、iv?、salt?、结果)也是完美的。请注意,“pbewithmd5和tripledes”是一个不好使用的算法。请参见phpseclib 3.0如何使用pbewithmd5和des CBC:pbewithmd5和tripledes CBC不在我所知的任何IETF RFC中。PBewithmd5和DES CBC的定义如下:
if (strlen($salt) != 8) {
    throw new Exception('Salt must be 8 bytes long');
}