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 大小的主要内容,如果未能解决你的问题,请参考以下文章
返回正确大小的页脚时,部分页脚中的 UITableView 随机白线