NodeJS可正常解密加密音频 PHP解密后输出文件存在跳音求解决方案
问题核心原因
- openssl_decrypt 缺少
OPENSSL_RAW_DATA参数:PHP的openssl_decrypt默认会将输入密文当作Base64格式处理,同时返回Base64编码的明文,直接传入二进制密文且未指定该参数,会导致解密块内容错误,这是跳音的核心诱因。 - IV值不匹配:Node.js中使用的IV是字节值为0、1、2、3、4、5、6、7的8字节序列,而原PHP代码中传入的是字符串
'01234567',对应的ASCII字节值为48到55,和Node.js的IV完全不一致,解密结果自然错误。 - 二进制文件读取方式不严谨:使用
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
相关产品推荐
相关产品推荐

