gpt4 book ai didi

node.js - 如何修复AES解密密文头部的 "garbage"?

转载 作者:搜寻专家 更新时间:2023-11-01 00:28:58 31 4
gpt4 key购买 nike

我正在研究由作为 Node.js 一部分的 crypto 模块实现的 AES 256,以评估我是否可以将它用于我计划作为我正在设计的应用程序。

我正在尝试验证一些加密的任意明文的解密,但我无法使原始明文和解密结果相匹配,这意味着我的加密、解密或两者都有问题。

据我所知,我最好选择一个随机初始化向量 (IV),这是我使用 crypto.randomBytes(16) 做的——证据表明(文档没有说明)它需要为 128 位。我显然还需要 CBC 模式,这很有意义,因为我的用例要求明文具有任意长度。我也不需要 PBKDF2 或任何类似的东西,因为我自己选择了我自己的 key ,这根本与密码无关。

现在,其中一些似乎可以正常工作,显然,但我从解密中获得的明文的前 16 个字节是“乱码”。直觉告诉我这与填充、IV 或两者有关。我不确定为什么我应该为 Decipher 选择 IV,但无论如何,只有部分解密的明文与原始文本匹配,我不知道为什么。

用代码来解释:

var key = fs.readFileSync("/root/key"); // 256 bits worth of key from a file

function encrypt(plaintext) {
var cipher = crypto.createCipheriv("aes-256-cbc", key, crypto.randomBytes(16));
return Buffer.concat([ cipher.update(plaintext), cipher.final() ]);
}

function decrypt(ciphertext) {
var decipher = crypto.createDecipheriv("aes-256-cbc", key, crypto.randomBytes(16));
return Buffer.concat([decipher.update(ciphertext), decipher.final()]);
}

var plaintext = new Buffer("Quick brown fox jumps over the lazy dog.");

评估 plaintext.equals(decrypt(encrypt(plaintext))) 产生 falseplaintext.toString("utf8") == decrypt(加密(明文)).toString("utf8").如前所述,对解密明文与原始明文进行目视检查表明,恢复(解密)明文的前 128 位数据不同(错误)。

这可能与我对在解密阶段使用 IV 的误解有关,或者使用了 两个 不同的随机 IV。

我做错了什么,更重要的是,如果有的话,我在 AES 和 CBC 模式下没有得到什么,而不必理解所有与链接分组密码有关的东西?

我还尝试处理涉及的数据类型——使用纯 UTF-8 字符串而不是 Buffer 来表示纯文本和密文,但我上面的代码看起来最短,实际上至少成功了解密(随后使我后来关于结果的断言失败),而其他一些尝试让我从底层解密过程中得到一个实际的“解密错误”错误。

最佳答案

用于加密和解密的 IV 需要相同。这通常是通过将随机生成(且未加密)的 IV 作为密文前缀来实现的。对于 CBC,IV 始终与 block 大小相同 - 始终为 16 字节 - 解密首先从前 16 个字节检索 IV,然后解密其余部分。

关于node.js - 如何修复AES解密密文头部的 "garbage"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45471772/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com