7

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

4

2 に答える 2