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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:53:51