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

标签 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 位 key 和消息,并返回 128 位随机数、128 位标签和密文。

(加密代码取自 this example )

我正在使用默认的 Node.js crypto 进行解密图书馆。该库需要一个 session key 、一个标签和一个 IV。当我从 Python 库传递随机数作为 IV 时,它给出了“无效的 iv 大小”错误。 Examples Node 库似乎使用 12 个字符的字符串作为 IV。

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

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

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

最佳答案

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

关于python - AES-GCM 模式的正确 nonce/iv 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44009204/

相关文章:

python - 导航网格

python - 从 sklearn 导入 DecisionTreeRegressor >> ImportError

node.js - Google Cloud Functions - 存储库部署 - 读取设置文件

c# - Rfc2898DeriveBytes (PBKDF2) 实现中 key 大小的重要性

iOS CommonCrypto 引用

python - Django 3 'NoReverseMatch 在/post/1/

python - 从文件夹导入 Python 3 中的 .csv 文件

node.js - 如何使用 CLI 将 Microsoft botbuilder Nodejs 应用程序部署到 azure?

javascript - 如何删除 Node 时间表中的所有时间表?

java - 如何清除java.security.Key的内容?