解密的字符串总是返回 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?

fs.readFileSync 总是返回空字符串

为啥 '%d-%m-%Y' 格式总是返回 NULL?

执行立即更新返回 NULL 而非字符串查询工作正常

加解密