iOS原生RSA与Chilkat RSA库OAEP SHA256解密兼容性问题
RSA OAEP解密失败:iOS原生加密与Chilkat库的适配问题
我来帮你分析这个问题的核心原因,并给出具体的解决步骤:
核心问题:MGF1哈希算法不匹配
你的iOS原生加密代码使用的是SecKeyAlgorithm.rsaEncryptionOAEPSHA256,这个算法对应的是OAEP填充 + SHA-256哈希 + MGF1-SHA256掩码生成函数。但你的Chilkat代码只设置了oaepHash = "sha256",却没有指定MGF1的哈希算法——Chilkat默认会使用SHA-1作为MGF1的哈希,这就导致了加密和解密的填充逻辑完全不匹配,这是解密失败的根本原因。
从Chilkat的错误日志也能直接验证这一点:
OaepHashAlg: SHA-256 MgfHashAlg: SHA-1
解决步骤
1. 修正Chilkat的MGF1哈希算法设置
在你的Chilkat解密代码中添加一行,明确指定MGF1使用SHA-256哈希,和iOS端保持一致:
rsa.mgfHash = "sha256"
2. 确认字节序设置正确性
iOS原生RSA加密输出的密文是大端字节序(Big-Endian),符合PKCS#1标准。你当前设置的rsa.littleEndian = false是正确的,但如果旧版本Chilkat存在参数行为偏差,可以尝试补充设置:
rsa.bigEndian = true // 部分旧版本Chilkat提供该参数,与littleEndian互斥
3. 修改后的完整Chilkat解密代码
static func decrypt(base64 encryptedText: String, with xmlKey: String) -> Data? { let privateKey = CkoPrivateKey() guard let success = privateKey?.loadXml(xmlKey), success else { return nil } guard let rsa = CkoRsa() else { return nil } rsa.unlockComponent(Chilkat.key) rsa.oaepPadding = true rsa.littleEndian = false rsa.oaepHash = "sha256" // 新增:设置MGF1哈希为SHA256,匹配iOS加密配置 rsa.mgfHash = "sha256" rsa.encodingMode = "base64" rsa.importPrivateKeyObj(privateKey) if let decryptedData = rsa.decryptBytesENC(encryptedText, bUsePrivateKey: true) { return decryptedData } else { print(rsa.lastErrorText) return nil } }
4. 额外检查项
- 确保iOS端加密后的
Data转Base64时没有添加额外字符(比如换行),使用encryptedData?.base64EncodedString()默认选项即可。 - 确认公私钥对完全匹配,且密钥长度均为2048位(日志显示
ModulusBitLen: 2048,符合要求)。 - 考虑升级Chilkat到最新版本,你当前使用的9.5.0.72是2018年的旧版本,可能存在参数行为bug。
内容的提问来源于stack exchange,提问作者Dmitry Klimkin
相关产品推荐
相关产品推荐

