解密的字符串总是返回 Null
Posted
技术标签:
【中文标题】解密的字符串总是返回 Null【英文标题】:Decrypted String always returning Null 【发布时间】:2017-10-11 18:20:16 【问题描述】:使用从服务器获取的数据
var request = var request = URLRequest(url: URL(string: "http://www.example.com/test.php")!)
request.httpMethod = "POST"
let akey:String = txt_key.stringValue;
let email:String = txt_email.stringValue
let VAL:String="test"
var data="blah"
let postString = data
request.httpBody = postString.data(using: .utf8)
let task = URLSession.shared.dataTask(with: request) data, response, error in
guard let data = data, error == nil else /
print("error=\(error)")
return
if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 /
print("statusCode should be 200, but is \(httpStatus.statusCode)")
print("response = \(response)")
let responseString = String(data: data, encoding: .utf8)
print(responseString)
task.resume()
解密使用
func aesDecrypt(key:String, iv:String, options:Int = kCCOptionPKCS7Padding) -> String?
if let keyData = key.data(using: String.Encoding.utf8),
let data = NSData(base64Encoded: self, options: .ignoreUnknownCharacters),
let cryptData = NSMutableData(length: Int((data.length)) + kCCBlockSizeAES128)
let keyLength = size_t(kCCKeySizeAES128)
let operation: CCOperation = UInt32(kCCDecrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(options)
var numBytesEncrypted :size_t = 0
let cryptStatus = CCCrypt(operation,
algoritm,
options,
(keyData as NSData).bytes, keyLength,
iv,
data.bytes, data.length,
cryptData.mutableBytes, cryptData.length,
&numBytesEncrypted)
if UInt32(cryptStatus) == UInt32(kCCSuccess)
cryptData.length = Int(numBytesEncrypted)
let unencryptedMessage = String(data: cryptData as Data, encoding:String.Encoding.utf8)
return unencryptedMessage
else
return nil
return nil
即使responseString
不为空,以下代码总是返回
optional("")
let unencode = String(describing: responseString!).aesDecrypt(key: "123456789012asdsadasd", iv: "iv-salt-string--")
为什么会这样?请指教。
【问题讨论】:
您的第一个print(responseString)
显示了什么?你的帖子成功了吗?
需要一个具体的示例(带有responseString、key和iv)...
@techno:不。你必须在问题本身中提供minimal reproducible example。
你发送到服务器的是var data="blah"
...密钥和电子邮件根本没有使用。那是你的真实代码吗?
到目前为止的总结:使用某些密钥(您未提供)解密未知请求的(未知)响应失败,并且您显示的不是真实代码...我不是确定您期望的答案。
【参考方案1】:
根据 MartinR 的评论:
我已验证“JDoNBXk21oJ9x15Bkv12uw==”正是使用您的密钥和 iv 加密空字符串的结果。错误在您的 PHP 脚本中,而不是在 Swift 代码中。
因此您需要解决服务器上的错误。
【讨论】:
以上是关于解密的字符串总是返回 Null的主要内容,如果未能解决你的问题,请参考以下文章
如何在mongo聚合不起作用的情况下将字符串转换为日期总是返回null?
AJAX 将 JavaScript 字符串数组发布到 JsonResult 作为 List<string> 总是返回 Null?