关于python:AES-GCM模式的正确nonce / iv大小

correct nonce/iv size for AES-GCM mode

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

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

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

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

(此示例中的加密代码)

我正在使用默认的Node.js加密库解密。该库需要一个会话密钥,一个标记和一个IV。当我将Python随机数作为IV传递时,它给我一个"无效的IV大小"。错误。 Node库的示例似乎使用12个字符的字符串作为IV。

我的解密代码如下(从此处获取):

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

此方案的IV和随机数之间有什么区别?我该如何解决?谢谢!


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