CryptoJS.AES文件加解密:解密后文件损坏的问题排查与解决
解决CryptoJS.AES解密后文件损坏的问题
我最近在实现CryptoJS.AES文件加解密功能时,踩了个实实在在的坑:解密后的文件总是损坏,根本没法正常打开。
折腾了半天排查下来,发现问题出在解密后的处理步骤上——官方文档并没有明确说明文件加解密的完整流程,而我之前漏掉了关键的解码操作:解密后必须调用decryptFile.toString(CryptoJS.enc.Utf8)来处理结果,不然输出的内容格式不对,自然就导致文件损坏了。
下面是我整理的完整解决方案代码,包含加密和解密的完整流程:
import CryptoJS from 'crypto-js'; import fs from "fs"; // 自定义密钥(实际使用时请确保密钥的安全性) const key = CryptoJS.enc.Utf8.parse('your-32-character-key-here'); // AES-256需要32位密钥 const iv = CryptoJS.enc.Utf8.parse('your-16-character-iv-here'); // IV需要16位 // 加密文件函数 function encryptFile(inputFilePath, outputFilePath) { // 读取源文件内容 const fileContent = fs.readFileSync(inputFilePath, 'utf8'); // AES加密配置 const encrypted = CryptoJS.AES.encrypt(fileContent, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // 将加密结果写入文件 fs.writeFileSync(outputFilePath, encrypted.toString()); } // 解密文件函数 function decryptFile(inputFilePath, outputFilePath) { // 读取加密后的文件内容 const encryptedContent = fs.readFileSync(inputFilePath, 'utf8'); // AES解密 const decrypted = CryptoJS.AES.decrypt(encryptedContent, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); // 关键修复步骤:将解密结果转为UTF-8编码的字符串 const decryptedText = decrypted.toString(CryptoJS.enc.Utf8); // 将解码后的内容写入文件 fs.writeFileSync(outputFilePath, decryptedText); } // 使用示例(取消注释即可运行) // encryptFile('./source.txt', './encrypted.txt'); // decryptFile('./encrypted.txt', './decrypted.txt');
额外提醒几个关键点:
- 密钥和IV的长度要严格匹配AES算法要求(比如AES-256对应32位密钥、16位IV)
- 加密和解密时的模式、填充方式必须完全一致,否则会解密失败
- 解密后的
toString(CryptoJS.enc.Utf8)是修复文件损坏的核心,绝对不能省略
内容的提问来源于stack exchange,提问作者Кирилл
相关产品推荐
相关产品推荐

