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

React-Native与iOS NotificationServiceExtension AES-CBC解密乱码问题:CryptoJS与CryptoSwift适配排查

问题排查与解决方案

你的解密逻辑存在两个关键错误,直接导致了解密后出现乱码,我来帮你拆解并修正:

错误1:密文格式处理错误

CryptoJS的AES.encrypt(...).toString()返回的是Base64编码的密文,而非原始加密字节数组。你当前直接将这个Base64字符串转成UTF-8的UInt8数组,相当于把Base64每个字符的ASCII值当成了加密后的字节,完全偏离了实际密文内容。

错误2:多余的手动填充操作

你在解密前手动调用了Padding.pkcs7.add(to: bufContent, blockSize: AES.blockSize),这是画蛇添足的操作——加密时已经用PKCS7标准完成了填充,解密时CryptoSwift的AES模块会自动识别并移除填充字节。手动添加填充会让密文长度异常,解密后自然出现乱码。

修正后的iOS解密代码

// 假设encryptedBody是从React-Native端传来的Base64密文字符串
guard let aesKeyData = Data(hex: try clearAESKey.string(encoding: .utf8)), 
      let ivData = Data(hex: "101112131415161718191a1b1c1d1e1f"),
      let cipherData = Data(base64Encoded: encryptedBody) else {
    // 处理数据解析失败的情况
    print("Failed to parse key, iv or ciphertext")
    return
}

let aesKey = Array(aesKeyData)
let iv = Array(ivData)
let cipherBytes = Array(cipherData)

do {
    let aes = try AES(key: aesKey, blockMode: CBC(iv: iv), padding: .pkcs7)
    let decryptedBytes = try aes.decrypt(cipherBytes)
    let decryptedString = String(decoding: decryptedBytes, as: UTF8.self)
    print("Decrypted result: \(decryptedString)")
} catch {
    print("Decryption error: \(error.localizedDescription)")
}

关键修正点说明

  • 先将Base64格式的密文encryptedBody解码成Data,再转成UInt8数组,这才是真正的加密字节序列。
  • 移除了手动添加PKCS7填充的代码,让CryptoSwift自动处理填充逻辑。
  • 增加了数据解析的安全校验(比如Base64解码失败的情况),避免程序崩溃。

你可以尝试这个修正后的代码,应该就能得到正确的明文结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 15:32:29