0

帮助!

我正在使用 xcode 8 和 swift。我制作了这个应用程序,它可以将数据上传到一些数据被加密的 firebase。在我进行加密之前,我做了一个搜索功能,可以很好地搜索所有数据。现在我已经为一些数据添加了加密,我无法搜索加密的数据。因此我需要在搜索之前对其进行解密,但是我不知道该怎么做。

如果我们一步一步来...

对于加密我使用 RNCryptor 和 Cryptoswift。在我的一个视图控制器中,我制作了一个扩展字符串,其中 2 个函数是:

extension String{
func aesEncrypt(key: String, iv: String) throws -> String {
    let data = self.data(using: .utf8)!
    let encrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).encrypt([UInt8](data))
    let encryptedData = Data(encrypted)
    return encryptedData.base64EncodedString()
}
func aesDecrypt(key: String, iv: String) throws -> String {
    let data = Data(base64Encoded: self)!
    let decrypted = try! AES(key: key, iv: iv, blockMode: .CBC, padding: PKCS7()).decrypt([UInt8](data))
    let decryptedData = Data(decrypted)
    return String(bytes: decryptedData.bytes, encoding: .utf8) ?? "Could not decrypt"
}
}

首先我加密并上传数据:

//Krypterer data
    let input = Personnr.text
    let input2 = Korekort.text
    let key = key1
    let iv = key
    let en = try! input!.aesEncrypt(key: key!, iv: iv!)
    ePersonnr = en
    let en2 = try! input2!.aesEncrypt(key: key!, iv: iv!)
    eKorekortnr = en2

   //Samler alt data om bruger
    let data = ["Navn": Navn.text!,
            "Telefonnr": Telefonnr.text!,
            "Personnr": ePersonnr!,
            "Kørekortnr": eKorekortnr!,
            "Bil": Bil.text!,
            "Interesse": Interesse.text!]

    //Oploader til database
    self.ref.child("Buyers").child(ePersonnr!).setValue(data)

我从数据库中获得的加密密钥和 iv,但这不是问题。加密后的输出如下图。

输出

如您所见,有些数据是加密的,有些则不是。正如计划。

现在我需要在应用程序中搜索数据。为此,我做了一个搜索功能,其中包括:

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    if searchController.isActive && searchController.searchBar.text != "" {
        return filteredUsers.count
    }
    return self.usersArray.count
}


override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

    // Configure the cell...

    let user : NSDictionary?
    if searchController.isActive && searchController.searchBar.text != "" {
        user = filteredUsers[indexPath.row]
    }
    else
    {
        user = self.usersArray[indexPath.row]
    }

    cell.textLabel?.text = user?["Navn"] as? String
    cell.detailTextLabel?.text = user?["Telefonnr"] as? String

    return cell
}

func filterUsers (searchText:String) {
    self.filteredUsers = self.usersArray.filter{ user in
        var fNavn = false
        var personNr = false
        var searchBil = false
        var telefonNr = false
        var korekortNr = false


        if let Navn = user!["Navn"] as? String {
            fNavn =  Navn.lowercased().contains(searchText.lowercased())
        }
        if let Bil = user!["Bil"] as? String {
            searchBil = Bil.lowercased().contains(searchText.lowercased())
        }

        //Decryption of data
        if let Personnr = user![self.Personnr!] as? String {
            personNr = Personnr.lowercased().contains(searchText.lowercased())
        }
        if let Kørekortnr = user!["Kørekortnr"] as? String {
            korekortNr = Kørekortnr.lowercased().contains(searchText.lowercased())
        }
        if let Telefonnr = user!["Telefonnr"] as? String {
            telefonNr = Telefonnr.lowercased().contains(searchText.lowercased())
        }



        return fNavn || personNr || searchBil || korekortNr || telefonNr



    }

    tableView.reloadData()

}

问题是因为数据是加密的,我只能搜索加密的字符串,它现在是加密的值。因此我需要做一些事情,让我在搜索之前解密数据?

为此,我需要帮助。

如果您需要任何其他信息或者可能不理解某些代码,请告诉我。

我希望你能帮忙。

帮助!

4

0 回答 0