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

Node.js Crypto模块AES解密结果截断问题排查求助

Node.js AES解密结果截断的原因及修复方案

你的代码核心问题是加密和解密过程都只调用了update()方法,未调用final()方法。Node.js crypto模块中,update()负责处理大部分数据,但最终的残留数据(包括填充相关的收尾处理)需要通过final()来完成输出,忽略这一步会导致结果不完整。

修正后的代码

const crypto = require('crypto');

let aesKey = Buffer.from('41e7a9ffb80d49651e5068d3b78ce3e40b9129a12f359b0e7232466caba4babd', 'hex')
// 加密:拼接update和final的结果
let cipher = crypto.createCipheriv('aes-256-ecb', aesKey, '')
let encoded = Buffer.concat([cipher.update(Buffer.from('b9ec7407162374b9e3bb02f3f693d1ea3cbdfde0cdc3bb24890d5cc00fc09ffc', 'hex')), cipher.final()])

console.log("encodedHex:" + encoded.toString('hex'))

// 解密:同样拼接update和final的结果
let decipher = crypto.createDecipheriv('aes-256-ecb', aesKey, '');
let decoded = Buffer.concat([decipher.update(Buffer.from('bd453040b52525760298dd118f6861720926d70f83432023bb9cd4ef35ca4a5b','hex')), decipher.final()]);

console.log("decodedHex:" + decoded.toString('hex'))

关键说明

  • 加密时:你的原始代码中update()返回完整密文是特殊情况(明文长度刚好是AES块大小的整数倍),但规范写法必须拼接final()的结果,避免因数据长度变化导致加密结果缺失。
  • 解密时:密文长度为32字节(2个AES块),update()仅返回第一个块的解密结果,第二个块的结果需要通过final()获取,因此必须拼接两者才能得到完整明文。

内容的提问来源于stack exchange,提问作者Noer Cholis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 20:22:53