Chilkat iOS10+ RSA兼容性问题

3

我正在一个iOS应用中使用原生RSA,而在另一个应用中则使用Chilkat RSA库。在原生iOS端,我使用以下函数对数据进行加密(OAEP SHA256):

    static func encryptWithKey(_ data: Data, rsaKey: SecKey) -> Data? {
        let algorithm = SecKeyAlgorithm.rsaEncryptionOAEPSHA256

        guard SecKeyIsAlgorithmSupported(rsaKey, .encrypt, algorithm) else { return nil }

        var error: Unmanaged<CFError>?
        let encryptedData = SecKeyCreateEncryptedData(rsaKey, algorithm, data as CFData, &error)

        if let encryptionError = error {
            print(encryptionError.takeRetainedValue())
        }

        return encryptedData as Data?
    }

然后在另一个应用程序中,我使用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"
    rsa.encodingMode = "base64"

    rsa.importPrivateKeyObj(privateKey)

    if let decryptedData = rsa.decryptBytesENC(encryptedText, bUsePrivateKey: true) {
        return decryptedData
    } else {
        print(rsa.lastErrorText)
    }

    return nil
}

即使我使用了一对私钥/公钥,我仍然会收到一个错误(来自rsa.lastErrorText):
"ChilkatLog:
DecryptBytesENC(7ms):
    DllDate: Feb  1 2018
    ChilkatVersion: 9.5.0.72
    UnlockPrefix: XXXXXXXXXXXX
    Architecture: Little Endian; 64-bit
    Language: IOS C/C++/Swift/Objective-C
    VerboseLogging: 1
    usePrivateKey: 1
    Component successfully unlocked using purchased unlock code.
    rsaDecryptBytes(7ms):
    rsa_decrypt(7ms):
    KeyType: Private
    InputSize: 256
    Padding: OAEP
    OaepHashAlg: SHA-256
    MgfHashAlg: SHA-1
    ParamLen: 0
    ModulusBitLen: 2048
    inlen: 256
    modulus_bytelen: 256
    modulus_bitlen: 2048
    bigEndian: 0
    Byte swapping from big-endian to little-endian
    padding: OAEP
    No leading zero byte for OAEP decoding.
    OAEP decoding failed.
    --rsa_decrypt
    --rsaDecryptBytes
    Failed.
    --DecryptBytesENC
    --ChilkatLog"

任何想法?
2个回答

1

我添加了一些额外的日志记录,以便我们可以在RSA解密后但OAEP取消填充之前查看字节(十六进制)。在RSA解密后(但在OAEP取消填充之前),我们应该以这种格式看到字节:

0x00  || maskedseed || maskedDB

换句话说,结果的第一个字节应该是0。如果用于解密的RSA私钥与用于加密的公钥不对应,则会看到随机字节。(即第一个字节不是0)。掩码种子和掩码DB仍将显示为随机字节。

0
问题出在OAEP Mgf哈希函数上。如果您将oaepMgfHash设置为"sha256",它就与本机iOS RSA实现兼容了。此外,Chilkat库提供了自动回退到正确的oaepMgfHash函数的功能,以防您错误地指定了它。感谢Matt!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接