decipher.final(): 不支持的状态或无法验证数据
decipher.final(): Unsupported state or unable to authenticate data
我有以下代码:
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()
时抛出错误。我该如何解决?
使用经过身份验证的密码(aes-256-gcm
是)时,您需要密码中的 auth 标签;否则 Decipher.final()
将抛出(如您所见),因为它具有(或在本例中不具有)的 auth 标签与它认为的解密文本的 auth 标签不匹配。
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);
let encryptedData = cipher.update(message, 'utf-8', 'hex');
encryptedData += cipher.final('hex');
const authTag = cipher.getAuthTag().toString("hex"); // <- new
console.log({authTag, encryptedData}); // for debugging
const decipher = crypto.createDecipheriv(algorithm, sKey, iv);
decipher.setAuthTag(Buffer.from(authTag, 'hex')); // <- new
let decData = decipher.update(encryptedData, 'hex', 'utf-8');
decData += decipher.final('utf-8');
console.log('Decrypted message: ', decData)
我有以下代码:
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()
时抛出错误。我该如何解决?
使用经过身份验证的密码(aes-256-gcm
是)时,您需要密码中的 auth 标签;否则 Decipher.final()
将抛出(如您所见),因为它具有(或在本例中不具有)的 auth 标签与它认为的解密文本的 auth 标签不匹配。
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);
let encryptedData = cipher.update(message, 'utf-8', 'hex');
encryptedData += cipher.final('hex');
const authTag = cipher.getAuthTag().toString("hex"); // <- new
console.log({authTag, encryptedData}); // for debugging
const decipher = crypto.createDecipheriv(algorithm, sKey, iv);
decipher.setAuthTag(Buffer.from(authTag, 'hex')); // <- new
let decData = decipher.update(encryptedData, 'hex', 'utf-8');
decData += decipher.final('utf-8');
console.log('Decrypted message: ', decData)