AES 加密在 iOS 13.4 上无法正常工作

Posted

技术标签:

【中文标题】AES 加密在 iOS 13.4 上无法正常工作【英文标题】:AES encryption not working properly on iOS 13.4 【发布时间】:2020-03-28 19:59:22 【问题描述】:

我的 ios 应用程序使用 AES 加密创建一个密钥并将其与所有 API 一起发送,并且它正在服务器端被解密,现在在更新 OS 13.4 之后,从设备(而不是模拟器)创建的密钥在不正确,服务器抛出以下错误: “填充无效,无法移除。”

在 13.4 以下操作系统版本的设备上运行良好,我们使用 CommonCrypto 来加密我们端的密钥,以下是详细信息:

  let ivData = "passpharse".data(using:String.Encoding.utf8)!
  let cryptLength  = size_t(data.count + kCCBlockSizeAES128)
  var cryptData = Data(count:cryptLength
  let keyLength = size_t(kCCKeySizeAES128)
  let options   = CCOptions(kCCOptionPKCS7Padding)
  var numBytesEncrypted :size_t = 0

令人惊讶的是,某些 API 调用的密钥是正确生成的,尽管密钥生成使用了相同的方法。

使用 iOS - 操作系统低于 13.4 的用户不会遇到任何问题,如果有人遇到过同样的情况,请指导。

提前致谢。

【问题讨论】:

我有同样的问题.. 我的加密和解密单元测试都成功了,但是在设备上运行它时,它失败了.. 它总是返回这个: IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA .. 超级奇怪!在 iOS 13.x 之后,我们也开始看到这些问题...... @NicolaiHarbo 请看我的回答。 【参考方案1】:

经过大量研究,我使它适用于所有版本。 如果在上面的代码中“passphrase”短于 16 个字节,它将使用内存中的任何内容。 似乎对 CommonCrypto API 的不当使用是这里的问题。真的不知道以前为什么会这样,但也许我们对内存布局很幸运,但上述问题需要解决,然后才能按预期运行。

【讨论】:

以上是关于AES 加密在 iOS 13.4 上无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

快速的 AES 加密

AES加密无效填充

IOS AES加密

无法退出不存在的沙盒帐户 iOS 13.4

Qt/QML SwipeDelegate 在移动设备(Android、iOS)上无法正常工作

iOS AES的加密解密