如何修复Javascript中的“无效密文大小”错误? (aes)

时间:2019-01-16 12:58:25

标签: javascript html encryption vue.js aes

我正在尝试使用密钥和AES-JS库解密数据。 每当我放一个16字节的密钥时,都会出现以下错误:

  

错误:“密文大小无效(必须为16个字节)”

我已经尝试将密钥更改为非16个字节的值,但是随后出现此错误:

  

错误:“无效的密钥大小(必须为16、24或32个字节)”

到目前为止,这是我的代码:

export const getEventBlockData = (cm, eventBlockData) => {
  const encryptedBlockBuf = Buffer.from(eventBlockData, 'base64');
  const aes = new aesjs.AES(aesjs.utils.utf8.toBytes('1111111111111111'));
  const decryptedBlockBuffer = new Buffer(aes.decrypt(encryptedBlockBuf));
};

产生错误的部分是aes.decrypt(...的最后一行

NB:cm var应该是关键,但出于测试目的,我将其替换为字符串“ 1111111111111111”,而eventBlockData是我要解密的缓冲区,他具有以下形式:

Event Block Data :{"type":"Buffer","data":[49,56,53,50,55,51,53,49,50,50,48,48,48,49,48,48,48,48,49]} cm-service.js:61
Encrypted Block buff :{"type":"Buffer","data":[49,56,53,50,55,51,53,49,50,50,48,48,48,49,48,48,48,48,49]}

感谢您的时间! :)

1 个答案:

答案 0 :(得分:1)

实际上,错误提示为invalid ciphertext size (must be 16 bytes),因此问题不在于您的key,并且更改了key的长度(就像您在帖子中所说的那样)无法解决问题因为它与密钥无关。

这是与 issue 有关的常见且已知的 the length of plaintext in CBC ,当您使用长度不等于倍数的密文时,就会发生这种情况16个字节。

要解决此问题,您需要为加密的文本添加padding,有关更多详细信息,请阅读 Why must all inputs to AES be multiples of 16?