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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 19:18:15