我尝试使用node crypto提供的aes-128-gcm来实现加密/解密函数。据我所知,gcm加密密文,但也散列它,并将其作为一个“authentication tag”提供。然而,我一直收到错误:“不支持的状态或无法验证数据”。
我不确定这是否是代码中的错误-查看加密的密文和auth标记,解密函数获取的密文和加密函数生成的密文是相同的。
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();
}
www.example.com()正在引发错误decipher.final。
2条答案
按热度按时间af7jpaap1#
以防万一,如果有人仍然试图得到一个工作的例子,加密和解密过程。
我留下了一些意见,你应该考虑一下。
zwghvu4y2#
我设法解决了这个问题:问题是我没有为www.example.com()指定编码类型cipher.final,而是在String中返回它,因此它没有返回decipher.final()所期望的Buffer对象。
为了解决这个问题,我在cipher.update和www.example.com中的“hex”编码参数中添加了“utf-8”cipher.final,在decryption中则相反。
已编辑以添加代码示例-请注意,这是2018年的版本,因此现在可能已经过时。