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

Node-Forge AES加密中05十六进制填充码是什么?如何解填充?

Node-Forge AES填充规则与正确解填充方法

一、你看到的05填充码是什么?

这是PKCS#5填充标准的实现。AES块大小为16字节,当明文长度不是16的整数倍时,需要填充至块大小:

  • 假设需要填充n个字节(1 ≤ n ≤ 16),每个填充字节的十六进制值就是n的十六进制表示。
  • 你的示例中,"hello world"是11字节,16-11=5,所以填充5个十六进制为05(十进制5)的字节,对应解密后末尾的5个05。

二、正确的解填充方法(别直接用replaceAll!)

你当前用replaceAll("05", "")的方法存在严重隐患:如果原明文本身末尾包含十六进制05的字节,这种替换会误删原内容。

正确的逻辑是严格遵循PKCS#5规则处理:

  1. 取解密后字节数组的最后一个字节的值,这个值就是填充的字节数n。
  2. 从字节数组末尾截断掉n个字节,剩下的就是原始明文。

示例代码(基于Node-Forge)

假设你已经完成解密得到十六进制字符串:

const forge = require('node-forge');

// 解密得到的十六进制结果
const decryptedHex = "68656c6c6f20776f726c640505050505";
// 转成字节数组
const decryptedBytes = forge.util.hexToBytes(decryptedHex);
// 获取填充长度
const padLength = decryptedBytes[decryptedBytes.length - 1];
// 截断得到原明文字节数组
const originalBytes = decryptedBytes.slice(0, decryptedBytes.length - padLength);
// 转成字符串
const originalText = forge.util.bytesToString(originalBytes);
console.log(originalText); // 输出:hello world

为什么你的示例能正常工作?

因为你的原明文"hello world"里没有05对应的字节,所以误打误撞得到了正确结果,但换个场景就会出错——比如原明文是"hello world\x05"(末尾带一个0x05字节),解密后填充的是4个04,这时候用replaceAll不会影响,但如果原明文是15字节且末尾有01,填充1个01,replaceAll("01", "")就会把原内容的01也删掉。

内容的提问来源于stack exchange,提问作者Ironislife 98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 16:15:20