You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP7.2替换mcrypt为OpenSSL实现TripleDES解密失效问题排查

解决PHP 7.2+中OpenSSL替代mcrypt TripleDES解密的问题

我帮你排查了问题,你的OpenSSL替代代码有几个关键的地方和原mcrypt代码不匹配,导致解密失败,下面是修正后的代码和详细说明:

修正后的完整解密函数

function triple_decrypt($input){
    $key = "thisis87658748639testkey";
    // 明确指定ECB模式,和原mcrypt的MCRYPT_MODE_ECB对应
    $cipher = "des-ede3-ecb";
    // 原mcrypt代码里第一步就是Base64解码,新代码必须补上这一步
    $input = base64_decode($input);
    // ECB模式不需要IV,直接传空即可(原mcrypt的IV其实没起作用)
    // 设置选项:OPENSSL_RAW_DATA表示输入是原始二进制;OPENSSL_ZERO_PADDING对应原mcrypt的零填充逻辑
    $pwd = openssl_decrypt($input, $cipher, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING);
    // 保留原代码的trim操作,去除末尾的\x00到\x0F填充字符
    $pwd = trim($pwd, "\x00..\x0F");
    return $pwd;
}

原代码的问题点解析

  1. 缺少Base64解码步骤:
    原mcrypt函数一开始就对输入做了base64_decode,但你的OpenSSL代码直接使用了未解码的输入,导致解密的不是正确的二进制密文。

  2. 未明确指定ECB模式:
    原mcrypt用的是MCRYPT_MODE_ECB(电子密码本模式),但你写的des-ede3在OpenSSL中默认会使用CBC模式(需要有效IV),而ECB模式不需要IV,所以必须明确写成des-ede3-ecb。

  3. 错误生成并传递IV:
    ECB模式不依赖初始化向量(IV),原mcrypt代码里虽然创建了IV,但实际没起作用(ECB模式会忽略IV)。你在OpenSSL代码里生成随机IV并传递,反而会干扰解密过程。

  4. 填充模式与选项不匹配:

    • mcrypt默认使用零填充,而OpenSSL默认使用PKCS#7填充,所以需要指定OPENSSL_ZERO_PADDING选项来对齐逻辑。
    • 同时要加上OPENSSL_RAW_DATA,因为我们已经手动做了Base64解码,输入是原始二进制数据,不是Base64编码的字符串。
  5. 遗漏原有的trim操作:
    原mcrypt代码解密后会去除末尾的\x00到\x0F字符,这一步在OpenSSL代码里需要保留,否则解密结果会带有填充的垃圾字符。

测试代码(和你原来的一致)

$value="###lllljG5ZOibDGtlL gcQLAtTQUnCJ/bE2glWsL1WKVPdC22c9GtGe/Npx9Uv9IYaszOAVXB4T9s7Hsss/2XpZ9oisx5M4jeV7RK2S/JrBt2E4GEcDGwuJs6NhkKV8hdOcU tmkJLxO3OJ OgVbqrT6a4v5RE7w eP zvQwZyAR5cYCKUYomou9mL/pvfLbe RrBe5ZnMQmUrD6cwUxEE/inikMvIb4K7HI fVPid N B3iPnIYQna6/v9W5A0kslBj6BBDjVXJabwmCSDVxbArm0GDNseWoQAEa4BMxYitqP6cVTxL5Kri8xbAKCW5/unnYnudkHQjNJWW7LuiwDxsBqwQv8D/R/Ff/joFW6q0 muI16/CfIoFnYAyAJWNlKCX9";
$value = urldecode($value);
$value = str_replace(" ", "+", $value);
$abc = triple_decrypt($value);
print_r($abc);

内容的提问来源于stack exchange,提问作者Tushar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 09:10:41