我正在尝试使用密钥和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]}
感谢您的时间! :)
答案 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? 。