You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android中为AES_128/GCM添加IV时遇长度错误问题求助

问题原因与解决方法

首先得明确:AES-128里的128指的是密钥长度(16字节),和IV(随机数/Nonce)长度完全是两回事。

你遇到的报错是因为GCM模式对IV长度有明确规范:

  • NIST(美国国家标准与技术研究院)推荐GCM使用12字节(96位)的IV,这是最优长度,能避免额外的计算开销,也是大多数密码库(包括Java的Cipher实现)默认要求的长度。
  • 虽然GCM理论上支持1到2^64-1比特的IV,但非12字节的IV需要特殊处理,Java默认的IvParameterSpec不支持直接传入非12字节的IV给GCM模式,必须用GCMParameterSpec来指定。

解决办法

方案1:改用12字节的IV(推荐)

这是最安全且符合规范的做法,直接调整你的nonceByteArray取前12字节:

cipher.init(Cipher.ENCRYPT_MODE, secretKey, IvParameterSpec(nonceByteArray, 0, 12))

方案2:强制使用16字节IV(不推荐,仅特殊场景)

如果业务必须用16字节IV,需要换用GCMParameterSpec来初始化,同时指定认证标签长度(通常是128位,即16字节):

val spec = GCMParameterSpec(128, nonceByteArray, 0, 16)
cipher.init(Cipher.ENCRYPT_MODE, secretKey, spec)

⚠️ 注意:非12字节的IV必须保证绝对唯一,同一密钥下不能重复使用,否则会导致GCM的认证标签失效,加密数据可能被篡改或破解。

内容的提问来源于stack exchange,提问作者Belphegor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 22:25:25