decipher.final():不支持的状态或无法验证数据
我有以下代码:
const crypto = require("crypto");
const algorithm = "aes-256-gcm";
const message = "This is a secret message";
const iv = crypto.randomBytes(12);
const sKey = crypto.randomBytes(32);
const cipher = crypto.createCipheriv(algorithm, sKey, iv);
const decipher = crypto.createDecipheriv(algorithm, sKey, iv)
let encryptedData = cipher.update(message, "utf-8", "hex");
encryptedData += cipher.final("hex");
let decData = decipher.update(encryptedData, "hex", "utf-8");
decData += decipher.final("utf-8");
console.log("Encrypted message: " + encryptedData);
console.log("Decrypted message: ", decData)
当我运行它时,我收到以下异常:
node:internal/crypto/cipher:193
const ret = this[kHandle].final();
^
Error: Unsupported state or unable to authenticate data
at Decipheriv.final (node:internal/crypto/cipher:193:29)
at Object.<anonymous> ([...]/crypto-test.js:15:21)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
调用decipher.final()
时抛出错误。我该如何修复它?
I have the following code:
const crypto = require("crypto");
const algorithm = "aes-256-gcm";
const message = "This is a secret message";
const iv = crypto.randomBytes(12);
const sKey = crypto.randomBytes(32);
const cipher = crypto.createCipheriv(algorithm, sKey, iv);
const decipher = crypto.createDecipheriv(algorithm, sKey, iv)
let encryptedData = cipher.update(message, "utf-8", "hex");
encryptedData += cipher.final("hex");
let decData = decipher.update(encryptedData, "hex", "utf-8");
decData += decipher.final("utf-8");
console.log("Encrypted message: " + encryptedData);
console.log("Decrypted message: ", decData)
When I run it, I receive the following exception:
node:internal/crypto/cipher:193
const ret = this[kHandle].final();
^
Error: Unsupported state or unable to authenticate data
at Decipheriv.final (node:internal/crypto/cipher:193:29)
at Object.<anonymous> ([...]/crypto-test.js:15:21)
at Module._compile (node:internal/modules/cjs/loader:1101:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:17:47
Error is thrown when calling decipher.final()
. How can I fix it?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
当使用经过身份验证的密码(即
aes-256-gcm
)时,您将需要密码中的 auth 标签;否则Decipher.final()
将抛出(如您所见),因为它具有(或在本例中没有)的身份验证标记与它认为解密文本的身份验证标记不匹配。When using an authenticated cipher (which
aes-256-gcm
is), you'll need the auth tag from the cipher; otherwiseDecipher.final()
will throw (as you can see) since the auth tag it has (or in this case, doesn't) doesn't match what it thinks the deciphered text's auth tag is.