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

iOS中RNCryptor解密失败问题求助

问题根源:解密后错误地转成Base64字符串啦!

你看你的decrypt函数里,拿到解密后的decryptedData之后,居然调用了base64EncodedString——这完全搞反逻辑了!decryptedData本身就是原明文的UTF-8二进制数据,你应该把它转回UTF-8字符串,而不是再编码成Base64。

你现在得到的MTIzNDU2Nzg5其实是原字符串123456789的Base64编码,这就解释了为什么看起来像随机字符串,但其实是有规律的编码结果。

修复后的代码

把decrypt函数里的错误转换代码替换掉就行,同时我还帮你优化了强制解包的安全性,避免数据异常时崩溃:

func encrypt(plainText : String, password: String) -> String {
    let data: Data = plainText.data(using: .utf8)!
    let encryptedData = RNCryptor.encrypt(data: data, withPassword: password)
    let encryptedString : String = encryptedData.base64EncodedString(options: Data.Base64EncodingOptions.lineLength76Characters)
    return encryptedString
}

func decrypt(encryptedText : String, password: String) -> String {
    do {
        guard let data = Data(base64Encoded: encryptedText, options: .ignoreUnknownCharacters) else {
            return "INVALID BASE64 FORMAT"
        }
        let decryptedData = try RNCryptor.decrypt(data: data, withPassword: password)
        guard let decryptedString = String(data: decryptedData, encoding: .utf8) else {
            return "FAILED TO CONVERT DATA TO UTF-8 STRING"
        }
        return decryptedString
    } catch {
        return "DECRYPT FAILED: \(error.localizedDescription)"
    }
}

let plainText = "123456789"
let password = "ABCDEFGHIJ"
let encryptedText = encrypt(plainText: plainText, password: password)
let decryptedText = decrypt(encryptedText: encryptedText, password: password)
print("ENCRYPTED TEXT : \(encryptedText)")
print("DECRYPTED TEXT : \(decryptedText)")

修复说明

核心修改点是把解密后的二进制数据通过String(data:encoding:)转成UTF-8字符串,而不是再做Base64编码。另外新增的guard let语句能帮你在数据格式异常时返回更明确的错误信息,比原代码的强制解包更安全。

运行修复后的代码,你会发现decryptedText完美还原成原明文123456789了!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:48:01