我正在尝试使用节点加密提供的 aes-128-gcm 来实现加密/解密功能。据我了解,gcm 对密文进行加密,但也会对其进行哈希处理并将其作为“身份验证标签”提供。但是,我不断收到错误消息:“不受支持的状态或无法验证数据”。
我不确定这是否是我的代码中的错误 - 查看加密的密文和身份验证标签,解密函数获取的与加密函数生成的相同。
function encrypt(plaintext) {
// IV is being generated for each encryption
var iv = crypto.randomBytes(12),
cipher = crypto.createCipheriv(aes,key,iv),
encryptedData = cipher.update(plaintext),
tag;
// Cipher.final has been called, so no more encryption/updates can take place
encryptedData += cipher.final();
// Auth tag must be generated after cipher.final()
tag = cipher.getAuthTag();
return encryptedData + "$$" + tag.toString('hex') + "$$" + iv.toString('hex');
}
function decrypt(ciphertext) {
var cipherSplit = ciphertext.split("$$"),
text = cipherSplit[0],
tag = Buffer.from(cipherSplit[1], 'hex'),
iv = Buffer.from(cipherSplit[2], 'hex'),
decipher = crypto.createDecipheriv(aes,key,iv);
decipher.setAuthTag(tag);
var decryptedData = decipher.update(text);
decryptedData += decipher.final();
}
decipher.final() 抛出错误。