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

