编辑:问题可以简化为: 以下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有什么区别?我该如何解决这个问题?谢谢!
答案 0 :(得分:1)
事实证明,GCM的nonce应该是12个字节长。我不确定为什么python库默认自动生成一个16字节的nonce,但是你可以自己生成并在configure
构造函数中手动指定它,这就是我所做的。整个系统现在完美运行