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
相关产品推荐
相关产品推荐

