AES-GCM模式的正确nonce / iv大小

时间:2017-05-16 18:40:49

标签: python node.js cryptography aes aes-gcm

编辑:问题可以简化为: 以下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位nonce,128位标记和密文。

(加密代码取自this example

我正在使用默认的Node.js crypto库进行解密。该库需要会话密钥,标记和IV。当我从Python库中传递nonce作为IV时,它给出了“无效的iv大小”错误。 Node库的Examples似乎使用12个字符的字符串作为IV。

我的解密代码如下(取自here):

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

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

1 个答案:

答案 0 :(得分:1)

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