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规则处理:
- 取解密后字节数组的最后一个字节的值,这个值就是填充的字节数
n。 - 从字节数组末尾截断掉
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
相关产品推荐
相关产品推荐

