ノード暗号によって提供される 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() によってスローされています。