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
相关产品推荐
相关产品推荐

