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

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,提问作者Кирилл

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:10:33