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

NodeJS可正常解密加密音频 PHP解密后输出文件存在跳音求解决方案

问题核心原因

  1. openssl_decrypt 缺少 OPENSSL_RAW_DATA 参数:PHP的openssl_decrypt默认会将输入密文当作Base64格式处理,同时返回Base64编码的明文,直接传入二进制密文且未指定该参数,会导致解密块内容错误,这是跳音的核心诱因。
  2. IV值不匹配:Node.js中使用的IV是字节值为0、1、2、3、4、5、6、7的8字节序列,而原PHP代码中传入的是字符串'01234567',对应的ASCII字节值为48到55,和Node.js的IV完全不一致,解密结果自然错误。
  3. 二进制文件读取方式不严谨:使用file()函数读取二进制音频文件会按行分割内容,遇到二进制中的换行符可能导致数据读取异常,直接用file_get_contents读取完整二进制内容更可靠。

修正后PHP代码

// 直接读取完整二进制内容
$tBuffer = file_get_contents('encrypted.mp3');
$tChunks = str_split($tBuffer, 2048);
// 用wb模式覆盖写入二进制文件,避免旧内容残留
$f = fopen('decrypted.mp3', 'wb');
$p = 0;
// 生成和Node.js完全一致的IV:字节值0~7
$iv = pack('C*', 0, 1, 2, 3, 4, 5, 6, 7);
// 固定步长和Node.js逻辑对齐
$step = 2048 * 3;

foreach ($tChunks as $chunk) {
    $chunkSize = strlen($chunk);
    if ($p % $step === 0 && $chunkSize === 2048) {
        // 增加OPENSSL_RAW_DATA参数,处理原始二进制数据
        $chunk = openssl_decrypt($chunk, 'bf-cbc', $key, OPENSSL_NO_PADDING | OPENSSL_RAW_DATA, $iv);
    }
    fwrite($f, $chunk);
    $p += $chunkSize;
}
fclose($f);

内容的提问来源于stack exchange,提问作者Théo Dulieu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:06:03