Node.js使用crypto-js实现视频加解密后解密文件无法播放及体积偏大问题
问题原因定位
全流程编码转换逻辑损坏二进制数据
- 自定义的
streamToString函数会把读取到的文件Buffer强制转换为UTF-8字符串。视频文件属于纯二进制格式,不满足UTF-8编码规则,转换过程中所有不合法的字节序列会被替换为固定长度的UTF-8替换字符,直接篡改原始视频的字节结构。这个步骤是解密后文件无法播放、体积明显大于原文件的核心诱因——单字节的非法序列被替换为3字节的替换字符后,累计会造成文件体积明显膨胀。 - 解密完成后,代码会把解密得到的WordArray格式二进制内容,再次强制转换为UTF-8字符串写入输出文件,在最终输出环节进一步破坏二进制数据的完整性。
密钥与初始向量(IV)不符合AES算法要求
- 代码中作为密钥、IV使用的字符串长度为22,既不符合合法Base64字符串的格式要求(合法Base64字符串长度必须为4的倍数),又直接通过
CryptoJS.enc.Base64.parse()解析,最终得到的密钥、IV长度无法满足AES算法的硬性约束(AES要求密钥长度为16/24/32字节,IV固定为16字节)。 - 这种场景下CryptoJS会自动对长度不足的密钥、IV做补全处理,实际生效的加密/解密密钥和预期完全不一致,即便编码流程没有错误,解密结果也会是无效乱码。
数据流转载体选择错误
- 对二进制文件做AES加解密时,全程不能以字符串作为数据流转的载体,必须直接以Buffer类型处理原始字节流,避免任何无意义的编码转换造成的字节损坏。
内容的提问来源于stack exchange,提问作者CodeDezk
相关产品推荐
相关产品推荐

