3

编辑:问题可以简化为:以下 Node.js 代码给出“无效的 IV 长度”错误。为什么?IV应该是什么?

const crypto = require('crypto')
const decipher = crypto.createDecipheriv('aes-128-gcm', crypto.randomBytes(16), crypto.randomBytes(16))

我在 GCM 模式下使用 AES 加密一些数据,但我使用两种不同的语言和库进行加密和解密,它们似乎对我需要的内容有不同的词汇表。

我正在使用 Python 库(Crypto)进行加密。该encrypt_and_digest方法采用 128 位密钥和一条消息,并返回一个 128 位随机数、128 位标记和一个密文。

(取自本例的加密代码)

我正在使用默认的 Node.js加密库进行解密。该库需要一个会话密钥、一个标签和一个 IV。当我将 Python 库中的 nonce 作为 IV 传递时,它给了我一个“invalid iv size”错误。 Node 库的示例似乎使用 12 个字符的字符串作为 IV。

我的解密代码如下所示(取自此处):

var decipher = crypto.createDecipheriv(algorithm, password, nonce)
decipher.setAuthTag(encrypted.tag);
var dec = decipher.update(encrypted.content, 'hex', 'utf8')

这个方案的 IV 和 nonce 有什么区别?我应该如何解决这个问题?谢谢!

4

1 回答 1

8

事实证明,GCM 的 nonce 应该是 12 个字节长。我不确定为什么 python 库默认自动生成一个 16 字节的随机数,但您可以生成自己的并在AES构造函数中手动指定它,这就是我所做的。整个系统现在完美运行

于 2017-05-16T20:03:03.890 回答