AES-GCM 模式的正确随机数/iv 大小

Posted

技术标签:

【中文标题】AES-GCM 模式的正确随机数/iv 大小【英文标题】:correct nonce/iv size for AES-GCM mode 【发布时间】:2017-10-15 23:49:08 【问题描述】:

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

(取自this example的加密代码)

我正在使用默认的 Node.js crypto 库进行解密。该库需要一个会话密钥、一个标签和一个 IV。当我将 Python 库中的 nonce 作为 IV 传递时,它给了我一个“invalid iv size”错误。 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】:

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

【讨论】:

一些背景:12 字节(或者更确切地说是 96 位)是 GCM 的 NIST 规范(如果我没记错的话,是 38D 文档)中推荐的默认值。其他尺寸需要额外的操作,可能安全性稍差。因此 NIST 建议始终使用 96 位,尤其是以保持与其他实现的兼容性

以上是关于AES-GCM 模式的正确随机数/iv 大小的主要内容,如果未能解决你的问题,请参考以下文章

AES GCM加密模式的初始向量IV怎么确定

随机数在密码学中的作用

CWE-329: 密码分组链接模式未使用随机初始化矢量

返回正确大小的页脚时,部分页脚中的 UITableView 随机白线

PHP mcrypt_create_iv 返回问号和不正确的长度 - CodeIgniter

JS_生成随机矩形位置/矩形大小_面向对象_原型+构造函数模式