Node 中的 aes-128-gcm “状态不受支持或无法验证数据”

2024-04-05

我正在尝试使用节点加密提供的 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() 引发的。


如果有人仍然试图获得加密和解密过程的工作示例。

我留下了一些应该考虑的评论。

import * as crypto from 'crypto';

const textToEncode = 'some secret text'; // utf-16
const algo = 'aes-128-gcm';

// Key bytes length depends on algorithm being used:
// 'aes-128-gcm' = 16 bytes
// 'aes-192-gcm' = 24 bytes
// 'aes-256-gcm' = 32 bytes
const key = crypto.randomBytes(16);

const iv = crypto.randomBytes(16);
const cipher = crypto.createCipheriv(algo, key, iv);

const encrypted = Buffer.concat([
  cipher.update(Buffer.from(textToEncode, 'utf-8')),
  cipher.final(),
]);

const authTag = cipher.getAuthTag();

console.info('Value encrypted', {
  valueToEncrypt: textToEncode,
  encryptedValue: encrypted.toString('hex'),
  authTag: authTag.toString('hex'),
});

// It's important to use the same authTag and IV that were used during encoding
const decipher = crypto.createDecipheriv(algo, key, iv);
decipher.setAuthTag(authTag);

const decrypted = Buffer.concat([
  decipher.update(encrypted),
  decipher.final(),
]);

console.info('Value decrypted', {
  valueToDecrypt: encrypted.toString('hex'),
  decryptedValue: decrypted.toString('utf-8'),
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Node 中的 aes-128-gcm “状态不受支持或无法验证数据” 的相关文章

随机推荐

  • Spark.ml 回归计算的模型与 scikit-learn 不同

    我在 scikit learn 和 Spark ml 中设置一个非常简单的逻辑回归问题 结果有所不同 他们学习的模型不同 但我不明白为什么 数据相同 模型类型是相同 正则化相同 毫无疑问 我错过了一侧或另一侧的一些设置 哪个设置 我应该如何
  • Visual Studio C# - 未找到 SQLite.Interop.dll

    我目前正在尝试使用 Visual Studio 创建一个与 SQLite 一起使用的 C 应用程序 我使用 NuGet 为我的程序安装了 SQLite 解决方案资源管理器中出现了三个引用 System Data SQLite System
  • 刷新 Ajax 成功的数据表

    我正在使用数据表和 jquery 对话框 总的来说 我有 3 个表格和 3 个数据表 我的脚本运行良好 但我遇到的问题是在 ajax 保存成功时更新正确的数据表 它甚至不必是正确的对应表 它可以更新 3 个表单保存中任何一个的所有 3 个表
  • 仅当值既不为 null 也不未定义时才调用函数

    单击按钮时 我检查本地存储键中是否存在某些内容 如下所示 var a localStorage getItem foo if typeof a undefined Function 但如果该键根本不存在 则返回 null 我怎样才能打电话如
  • 为什么“Dispose”有效,而不是“using(var db = new DataContext())”?

    我正在创建一个由主题组成的论坛 主题由消息组成 当我尝试在我的控制器中实现主题视图时 public ActionResult Topic int id Topic Id using var db new DataContext var to
  • Flutter可拖动容器:从上到下扩展

    I want to achieve the following example 如您所见 用户必须能够从上到下拖动 开始时 只能看到图像 但是一旦用户从上到下拖动元素 它将显示更多内容 在扩展橙色容器时 它应该高于所有其他绿色元素 我调查过
  • 如何使用 C#、.NET 将文本写入 Word 文件

    我正在尝试使用 C 编写一些文本并将其附加到 Word 文件中 但是 我无法获得预期结果 你能帮我解决这个问题吗 下面是我的代码 using System using System Collections Generic using Sys
  • 自定义部分名称导致 NSFetchedResultsController 崩溃

    我有一个带有 dueDate 属性的托管对象 我没有使用一些丑陋的日期字符串作为 UITableView 的节标题进行显示 而是创建了一个名为 category 的瞬态属性 并将其定义如下 NSString category self wi
  • Scala Dataframe 列的 null 检查

    val new df df filter type interne type interne null 给我错误值 不是字符串的成员 当我使用 适用于过滤器 val new df df filter type interne type in
  • 命名空间中不存在来自 WPFToolkit 的控件

    我添加到引用 WPFToolkit dll 并添加了以下行的 xaml 文件 xmlns toolkit clr namespace Microsoft Windows Controls assembly WpfToolkit 并在以下行之
  • 使用 SendMessage API 检索 ComboBox 计数和项目

    我想得到一个计数和列表ComboBox控制权不属于我 因此我无法修改代码 例如 可以通过使用来控制目标应用程序SendMessage API 但是 如何通过挂钩检索目标控件的整个列表 您可以找到以下列表ComboBox控制消息在这里 MSD
  • PdfKit 高亮注释

    我正在尝试在 iOS 上使用 PDFKit 向文档添加突出显示注释 let highlight PDFAnnotation bounds selection bounds for page forType PDFAnnotationSubt
  • Delphi - 捕获具有当前焦点的窗口/窗体

    我有一个包含大量 MDI 子项 以及非 MDI 表单 的 MDI 应用程序 并且希望跟踪当前激活的表单并始终具有焦点 当用户在应用程序中从一种窗体切换到另一种窗体时 我想捕获窗口激活消息 并在后台将全局变量设置为活动窗体的属性 该属性是从基
  • C# 编译器或 JIT 能否优化 lambda 表达式中的方法调用?

    我在开始讨论后开始这个问题 在评论中 https stackoverflow com a 36438566 81179 关于另一个 StackOverflow 问题 我很想知道答案 考虑以下表达式 var objects RequestOb
  • 如何将 Array.prototype.filter 与异步一起使用?

    背景 我正在尝试过滤对象数组 在过滤之前 我需要将它们转换为某种格式 并且此操作是异步的 const convert gt new Promise resolve gt setTimeout resolve 1000 因此 我的第一次尝试是
  • 如何显示带有深色背景的弹出消息

    我将在我的程序中显示一条错误消息 我希望我的消息如下图所示 如您所见 我需要在弹出消息时显示黑色阴影 我遵循两种解决方案来执行此操作 1 我截取程序的屏幕截图 并将其与黑色混合 有点暗 然后将其附加到面板并显示面板 然后弹出消息表单 它不起
  • 如何阻止孩子传播由实时/委托侦听器触发的事件?

    我有一个委托父级 用于侦听具有特定类别的一组子级中的单击事件 toggle group on click toggle function e 这是 html 的一个例子 div class toggle group a class togg
  • DB2 错误 字符串列、主变量、常量或函数的使用不当

    我正在尝试搜索所有表和列中的某个值 并且使用 php 连接到 IBM DB2 数据库 我想知道该错误是否是由于多次使用联合造成的 这是我的错误消息 Improper use of a string column host variable
  • 以提升用户身份在 wix 中运行 CustomAction

    据我所知 WiX 支持两种 CustomActions 延迟 运行此操作的用户 默认情况下 被提升 但它不是运行安装的用户 例如 LocalSystem 或类似的用户 立即 运行此操作的用户 默认情况下 未提升 这是首先运行安装程序的用户
  • Node 中的 aes-128-gcm “状态不受支持或无法验证数据”

    我正在尝试使用节点加密提供的 aes 128 gcm 来实现加密 解密功能 根据我的理解 gcm 会加密密文 但也会对其进行哈希处理 并将其提供为 身份验证标签 但是 我不断收到错误 状态不受支持或无法验证数据 我不确定这是否是我的代码中的