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

