iOS12.1+ Swift中AES/GCM/NoPadding加密密文长度不符问题
解决Swift AES/GCM加密与Java实现匹配的问题
核心差异在于两者对GCM加密输出的处理逻辑不同:
- Java的
Cipher.doFinal()在GCM模式下,返回的是**明文加密后的密文 + 认证标签(Tag)**的组合数据 - 你当前的Swift代码中,
aes.encrypt()仅返回密文部分,缺少认证标签,这是长度不一致的直接原因
调整Swift代码,将密文与认证标签拼接后再组合iv、salt即可匹配Java行为,修改后的代码如下:
let gcm = GCM(iv: iv.bytes, additionalAuthenticatedData: nil, tagLength: tagLength) let aes = try AES(key: key.bytes, blockMode: gcm, padding: .noPadding) // 仅获取密文部分 let encryptedMessage = try aes.encrypt(message.bytes) // 将密文与生成的认证标签拼接 let encryptedWithTag = encryptedMessage + gcm.tag! // 按Java逻辑组合最终数据 let cipherData = Data(iv) + Data(salt) + Data(encryptedWithTag)
额外需要确认两个关键参数一致性:
tagLength必须与Java端完全匹配,GCM标准标签长度可选12/13/14/15/16字节,Java默认使用16字节(128位),确保Swift端配置相同- 确认Java端
initCipher方法未配置额外的附加认证数据(AAD),当前Swift代码中additionalAuthenticatedData设为nil,需保持一致
内容的提问来源于stack exchange,提问作者Inshaf
相关产品推荐
相关产品推荐

