当前位置: 首页 > 知识库问答 >
问题:

在节点中使用aes-128-gcm“不支持状态或无法验证数据”

姜锋
2023-03-14

我试图使用节点加密提供的aes-128-gcm实现加密/解密功能。根据我的理解,gcm对密文进行加密,但也对其进行散列,并将其作为“身份验证标记”提供。但是,我不断得到错误:“不支持状态或无法对数据进行身份验证”。

我不确定这是否是我的代码中的错误--查看加密的密文和auth标记,由decrypt函数提取的密文和由encrypt函数产生的密文是相同的。

    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()抛出的。

共有1个答案

萧和同
2023-03-14

我设法解决了这个问题:问题是我没有为cipher.final()指定编码类型,而且我在字符串中返回它,所以它没有返回decipher.final()所期望的缓冲区对象。

为了解决这个问题,我在我的cipher.update和cipher.final中的“十六进制”编码参数中添加了“UTF-8”,反之亦然。

 类似资料:
  • 我通过运行以下代码得到下面的错误。 错误:decipheriv.final(node:internal/crypto/cipher:196:29)在decrypt(/users/username/dev/playground/node/src/index.ts:14:65)处处于不支持状态或无法对数据进行身份验证 节点中aes-128-gcm的“不支持状态或无法验证数据” 在nodejs解密中获取

  • 我得到了一个错误: 不支持的密码算法(AES-256-GCM)(运行时错误) 但我似乎有所有的要求: $openssl enc-help 2>&1 grep gcm -AES-128-ECB-AES-128-GCM-AES-128-OFB -AES-192-ECB-AES-192-GCM-AES-192-OFB -AES-256-ECB-AES-256-GCM-AES-256-OFB Ruby解释

  • 我试图在objective c中加密/解密一个AES-128 GCM格式的字符串。我到处都找过了,但似乎找不到有效的解决方案。

  • 问题内容: 根据Java 7文档以及第三方供应商的说法,似乎Java 7应该支持AES-GCM套件: IBM Java 7 Java 7 SSL文档 在客户端和服务器之间的协商中遇到一些错误,由于仅将其限制为AES- GCM密码而无法协商密码。经过调查,我发现客户端或服务器(tomcat实例)均不支持密码套件。在客户端上运行一些示例代码以获取输出: 不知道是否有人遇到过这样的问题。 Java 7是

  • 我已经使用OpenSSL AES-256-GCM加密了一个文件。由于aes-256-gcm不受命令行支持,我已经安装了LibreSSL,我可以使用下面的命令加密文件的数据。 openssl ENC-AES-256-GCM-K 616161616161616161616161616161616161616161616161616161616161616161-IV 768A5C31A97D5FE9-